forked from ddrilling/AsbCloudServer
Merge branch 'dev' into gtr
This commit is contained in:
commit
7d83a0a93d
@ -3,8 +3,8 @@
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// блок КНБК
|
/// блок КНБК
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class BhaDto
|
public class BhaDto : ItemInfoDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// КНБК описание
|
/// КНБК описание
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1,10 +1,17 @@
|
|||||||
namespace AsbCloudApp.Data.DailyReport
|
using System;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.Data.DailyReport
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Блоки для формирования суточного рапорта
|
/// Блоки для формирования суточного рапорта
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DailyReportDto
|
public class DailyReportDto
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// дата отчёта
|
||||||
|
/// </summary>
|
||||||
|
public DateOnly StartDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// блок заголовка
|
/// блок заголовка
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -4,8 +4,8 @@ namespace AsbCloudApp.Data.DailyReport
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// блок заголовка
|
/// блок заголовка
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class HeadDto
|
public class HeadDto : ItemInfoDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// название скважины
|
/// название скважины
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -29,7 +29,7 @@ namespace AsbCloudApp.Data.DailyReport
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// дата рапорта
|
/// дата рапорта
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DateTime ReportDate { get; set; }
|
public DateOnly ReportDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// глубина забоя на дату начала интервала
|
/// глубина забоя на дату начала интервала
|
||||||
|
26
AsbCloudApp/Data/DailyReport/ItemInfoDto.cs
Normal file
26
AsbCloudApp/Data/DailyReport/ItemInfoDto.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.Data.DailyReport
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// хранение дополнительной информации о записи
|
||||||
|
/// запись формируется на сервере автоматически
|
||||||
|
/// </summary>
|
||||||
|
public class ItemInfoDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// пользователь, внесший изменения (запись формируется на сервере автоматически)
|
||||||
|
/// </summary>
|
||||||
|
public int? IdUser { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// имя пользователя, внесшего изменения (запись формируется на сервере автоматически)
|
||||||
|
/// </summary>
|
||||||
|
public string? UserName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// дата последнего обновления (запись формируется на сервере автоматически)
|
||||||
|
/// </summary>
|
||||||
|
public DateTimeOffset? LastUpdateDate { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -3,7 +3,7 @@
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// блок безметражные работы
|
/// блок безметражные работы
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class NoDrillingDto
|
public class NoDrillingDto : ItemInfoDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
/// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
||||||
|
@ -5,7 +5,7 @@ namespace AsbCloudApp.Data.DailyReport
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// блок САУБ
|
/// блок САУБ
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SaubDto
|
public class SaubDto : ItemInfoDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Режимы бурения в роторе
|
/// Режимы бурения в роторе
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// блок подписи
|
/// блок подписи
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SignDto
|
public class SignDto : ItemInfoDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ФИО Мастера буровой
|
/// ФИО Мастера буровой
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1,119 +1,18 @@
|
|||||||
namespace AsbCloudApp.Data.DailyReport
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.Data.DailyReport
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// блок баланса времени
|
|
||||||
/// </summary>
|
|
||||||
public class TimeBalanceDto
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Бурение
|
|
||||||
/// </summary>
|
|
||||||
public string Drilling { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Промывка
|
|
||||||
/// </summary>
|
|
||||||
public string Flushing { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Блок баланса времени
|
||||||
|
/// </summary>
|
||||||
|
public class TimeBalanceDto : ItemInfoDto
|
||||||
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Наращивание
|
/// Статистика по операциям
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Building { get; set; } = string.Empty;
|
public Dictionary<int, double> OperationsStat { get; set; } = new Dictionary<int, double>();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Проработка
|
|
||||||
/// </summary>
|
|
||||||
public string Elaboration { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Расширка
|
|
||||||
/// </summary>
|
|
||||||
public string Extension { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Ремонт
|
|
||||||
/// </summary>
|
|
||||||
public string Repair { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// КНБК
|
|
||||||
/// </summary>
|
|
||||||
public string Knbk { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// СПО
|
|
||||||
/// </summary>
|
|
||||||
public string Spo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ПЗР
|
|
||||||
/// </summary>
|
|
||||||
public string Pzr { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ПВО
|
|
||||||
/// </summary>
|
|
||||||
public string Pvo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ПГР
|
|
||||||
/// </summary>
|
|
||||||
public string Pgr { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ГИС
|
|
||||||
/// </summary>
|
|
||||||
public string Gis { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ОЗЦ
|
|
||||||
/// </summary>
|
|
||||||
public string Ozc { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Тех. работы
|
|
||||||
/// </summary>
|
|
||||||
public string EngineeringWorks { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Снятие замера
|
|
||||||
/// </summary>
|
|
||||||
public string TakingMeasure { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Цементирование
|
|
||||||
/// </summary>
|
|
||||||
public string Cementing { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Простой
|
|
||||||
/// </summary>
|
|
||||||
public string Simple { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// НПВ
|
|
||||||
/// </summary>
|
|
||||||
public string Npv { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Проработка перед наращиванием
|
|
||||||
/// </summary>
|
|
||||||
public string ElaborationBeforeBuilding { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Шаблонировка перед наращиванием
|
|
||||||
/// </summary>
|
|
||||||
public string TemplatingBeforeBuilding { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Промывка перед наращиванием
|
|
||||||
/// </summary>
|
|
||||||
public string FlushingBeforeBuilding { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Статический замер телесистемы
|
|
||||||
/// </summary>
|
|
||||||
public string StaticSurveying { get; set; } = string.Empty;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,10 +22,6 @@ namespace AsbCloudApp.Data
|
|||||||
[Range(1, int.MaxValue, ErrorMessage = "Id категории не может быть ниже 1")]
|
[Range(1, int.MaxValue, ErrorMessage = "Id категории не может быть ниже 1")]
|
||||||
public int CategoryId { get; set; }
|
public int CategoryId { get; set; }
|
||||||
|
|
||||||
//TODO: в модели дто сообщения отсутствует поле Id скважины
|
|
||||||
// скорее всего опечатка т.к. используется глубина в правиле валидатора
|
|
||||||
//в других валидаторах парамтр глубины идет рэнжированный от...до
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// глубина забоя, при котором событие возникло
|
/// глубина забоя, при котором событие возникло
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -45,6 +45,11 @@ namespace AsbCloudApp.Data
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string? CategoryName { get; set; }
|
public string? CategoryName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ключ родителя у категории
|
||||||
|
/// </summary>
|
||||||
|
public int? IdParentCategory { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// дополнительная информация по операции
|
/// дополнительная информация по операции
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -16,7 +16,7 @@ namespace AsbCloudApp.Requests
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// фильтр по дате окончания операции
|
/// фильтр по дате окончания операции
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DateTime? LeDate { get; set; }
|
public DateTime? LtDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// фильтр по максимальной глубине скважины
|
/// фильтр по максимальной глубине скважины
|
||||||
@ -71,7 +71,7 @@ namespace AsbCloudApp.Requests
|
|||||||
this.GeDepth = request.GeDepth;
|
this.GeDepth = request.GeDepth;
|
||||||
this.LeDepth = request.LeDepth;
|
this.LeDepth = request.LeDepth;
|
||||||
this.GeDate = request.GeDate;
|
this.GeDate = request.GeDate;
|
||||||
this.LeDate = request.LeDate;
|
this.LtDate = request.LtDate;
|
||||||
|
|
||||||
this.OperationCategoryIds = request.OperationCategoryIds;
|
this.OperationCategoryIds = request.OperationCategoryIds;
|
||||||
this.OperationType = request.OperationType;
|
this.OperationType = request.OperationType;
|
||||||
|
@ -16,40 +16,22 @@ namespace AsbCloudApp.Services
|
|||||||
/// получить список сформированных рапортов по скважине за период времени
|
/// получить список сформированных рапортов по скважине за период времени
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="v1"></param>
|
/// <param name="begin"></param>
|
||||||
/// <param name="v2"></param>
|
/// <param name="end"></param>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<DailyReportDto>> GetListAsync(int idWell, DateTime? v1, DateTime? v2, CancellationToken cancellationToken);
|
Task<IEnumerable<DailyReportDto>> GetListAsync(int idWell, DateOnly? begin, DateOnly? end, CancellationToken cancellationToken);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// получить из БД или генерировать данные для суточного рапорта за указанную дату
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idWell"></param>
|
|
||||||
/// <param name="date"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<DailyReportDto> GetOrGenerateAsync(int idWell, DateTime date, CancellationToken token);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Добавить новый рапорт
|
/// Добавить новый рапорт
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="dto"></param>
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="idUser"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> AddAsync(int idWell, DailyReportDto dto, CancellationToken token = default);
|
Task<int> AddAsync(int idWell, DateOnly startDate, int idUser, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// изменить данные для суточного рапорта
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idWell"></param>
|
|
||||||
/// <param name="date"></param>
|
|
||||||
/// <param name="dto"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<int> UpdateAsync(int idWell, DateTime date, DailyReportDto dto, CancellationToken token = default);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Сформировать файл рапорта
|
/// Сформировать файл рапорта
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -57,6 +39,16 @@ namespace AsbCloudApp.Services
|
|||||||
/// <param name="date"></param>
|
/// <param name="date"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<Stream?> MakeReportAsync(int idWell, DateTime date, CancellationToken token = default);
|
Task<Stream?> MakeReportAsync(int idWell, DateOnly date, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// изменить блок данных для суточного рапорта
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="dto"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<int> UpdateBlockAsync(int idWell, DateOnly startDate, ItemInfoDto dto, CancellationToken token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ namespace AsbCloudApp.Services
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IScheduleRepository : IRepositoryWellRelated<ScheduleDto>
|
public interface IScheduleRepository : IRepositoryWellRelated<ScheduleDto>
|
||||||
{
|
{
|
||||||
// TODO: this should be nullable.
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// получить бурильщика по idWell и времени
|
/// получить бурильщика по idWell и времени
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -18,6 +17,6 @@ namespace AsbCloudApp.Services
|
|||||||
/// <param name="workTime"></param>
|
/// <param name="workTime"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<DrillerDto?> GetDrillerAsync(int idWell, DateTime workTime, CancellationToken token);
|
Task<DrillerDto?> GetOrDefaultDrillerAsync(int idWell, DateTime workTime, CancellationToken token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ namespace AsbCloudApp.Services
|
|||||||
/// <param name="approxPointsCount">кол-во элементов до которых эти данные прореживаются</param>
|
/// <param name="approxPointsCount">кол-во элементов до которых эти данные прореживаются</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IEnumerable<TDto>?> GetOrDefaultAsync(int idWell,
|
Task<IEnumerable<TDto>> GetAsync(int idWell,
|
||||||
DateTime dateBegin = default, double intervalSec = 600d,
|
DateTime dateBegin = default, double intervalSec = 600d,
|
||||||
int approxPointsCount = 1024, CancellationToken token = default);
|
int approxPointsCount = 1024, CancellationToken token = default);
|
||||||
|
|
||||||
|
80
AsbCloudApp/ValidationAttributes/DateValidationAttribute.cs
Normal file
80
AsbCloudApp/ValidationAttributes/DateValidationAttribute.cs
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.ValidationAttributes
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Атрибут валидации даты-времени
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)]
|
||||||
|
public class DateValidationAttribute : ValidationAttribute
|
||||||
|
{
|
||||||
|
private DateTime? gtDate;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// null разрешен
|
||||||
|
/// </summary>
|
||||||
|
public bool AllowNull { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Разрешена только дат.
|
||||||
|
/// При наличии времени в DateTime инвалидирует.
|
||||||
|
/// При наличии UTC тоже инвалидирует.
|
||||||
|
/// </summary>
|
||||||
|
public bool IsDateOnly { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Допустима дата-время в UTC
|
||||||
|
/// </summary>
|
||||||
|
public bool AllowUtc { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Дата больше которой должно быть проверяемое значение.
|
||||||
|
/// Формат строки - любой поддерживаемый DateTime.Parse.
|
||||||
|
/// Желательно использовать ISO 8601 формат
|
||||||
|
/// </summary>
|
||||||
|
public string? GtDate {
|
||||||
|
get => gtDate.ToString();
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if(value is null)
|
||||||
|
gtDate = null;
|
||||||
|
else
|
||||||
|
gtDate = DateTime.Parse(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверка значения
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public override bool IsValid(object? value)
|
||||||
|
{
|
||||||
|
if (value is null)
|
||||||
|
return AllowNull;
|
||||||
|
|
||||||
|
if (value is not DateTime dateTime)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (IsDateOnly)
|
||||||
|
{
|
||||||
|
if (dateTime.Hour > 0 ||
|
||||||
|
dateTime.Minute > 0 ||
|
||||||
|
dateTime.Second > 0 ||
|
||||||
|
dateTime.Millisecond > 0 ||
|
||||||
|
dateTime.Kind == DateTimeKind.Utc)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AllowUtc && dateTime.Kind == DateTimeKind.Utc)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (gtDate.HasValue && dateTime <= gtDate)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,8 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using System.Text.Json;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -258,4 +260,17 @@ namespace AsbCloudDb
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public class DateOnlyJsonConverter : JsonConverter<DateOnly>
|
||||||
|
{
|
||||||
|
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
return DateOnly.FromDateTime(reader.GetDateTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
var isoDate = value.ToString("O");
|
||||||
|
writer.WriteStringValue(isoDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
7028
AsbCloudDb/Migrations/20230306085943_UpdateTable_t_daily_report_UpdateType_startDate_toDateOnly.Designer.cs
generated
Normal file
7028
AsbCloudDb/Migrations/20230306085943_UpdateTable_t_daily_report_UpdateType_startDate_toDateOnly.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace AsbCloudDb.Migrations
|
||||||
|
{
|
||||||
|
public partial class UpdateTable_t_daily_report_UpdateType_startDate_toDateOnly : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AlterColumn<DateOnly>(
|
||||||
|
name: "start_date",
|
||||||
|
table: "t_daily_report",
|
||||||
|
type: "date",
|
||||||
|
nullable: false,
|
||||||
|
comment: "Дата отчёта",
|
||||||
|
oldClrType: typeof(DateTimeOffset),
|
||||||
|
oldType: "timestamp with time zone",
|
||||||
|
oldComment: "Дата отчёта");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AlterColumn<DateTimeOffset>(
|
||||||
|
name: "start_date",
|
||||||
|
table: "t_daily_report",
|
||||||
|
type: "timestamp with time zone",
|
||||||
|
nullable: false,
|
||||||
|
comment: "Дата отчёта",
|
||||||
|
oldClrType: typeof(DateOnly),
|
||||||
|
oldType: "date",
|
||||||
|
oldComment: "Дата отчёта");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -148,8 +148,8 @@ namespace AsbCloudDb.Migrations
|
|||||||
.HasColumnName("id_well")
|
.HasColumnName("id_well")
|
||||||
.HasComment("ID скважины");
|
.HasComment("ID скважины");
|
||||||
|
|
||||||
b.Property<DateTimeOffset>("StartDate")
|
b.Property<DateOnly>("StartDate")
|
||||||
.HasColumnType("timestamp with time zone")
|
.HasColumnType("date")
|
||||||
.HasColumnName("start_date")
|
.HasColumnName("start_date")
|
||||||
.HasComment("Дата отчёта");
|
.HasComment("Дата отчёта");
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
namespace AsbCloudDb.Model.DailyReport
|
namespace AsbCloudDb.Model.DailyReport
|
||||||
{
|
{
|
||||||
public class Bha
|
public class Bha : ItemInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// КНБК описание
|
/// КНБК описание
|
||||||
|
@ -10,8 +10,8 @@ namespace AsbCloudDb.Model.DailyReport
|
|||||||
[Column("id_well"), Comment("ID скважины")]
|
[Column("id_well"), Comment("ID скважины")]
|
||||||
public int IdWell { get; set; }
|
public int IdWell { get; set; }
|
||||||
|
|
||||||
[Column("start_date", TypeName = "timestamp with time zone"), Comment("Дата отчёта")]
|
[Column("start_date", TypeName = "date"), Comment("Дата отчёта")]
|
||||||
public DateTimeOffset StartDate { get; set; }
|
public DateOnly StartDate { get; set; }
|
||||||
|
|
||||||
[Column("info", TypeName = "jsonb"), Comment("Список параметров для отчёта")]
|
[Column("info", TypeName = "jsonb"), Comment("Список параметров для отчёта")]
|
||||||
public DailyReportInfo Info { get; set; } = null!;
|
public DailyReportInfo Info { get; set; } = null!;
|
||||||
|
@ -7,7 +7,6 @@ namespace AsbCloudDb.Model
|
|||||||
public Head Head { get; set; } = null!;
|
public Head Head { get; set; } = null!;
|
||||||
public Bha Bha { get; set; } = new();
|
public Bha Bha { get; set; } = new();
|
||||||
public NoDrilling NoDrilling { get; set; } = new();
|
public NoDrilling NoDrilling { get; set; } = new();
|
||||||
public TimeBalance TimeBalance { get; set; } = new();
|
|
||||||
public Saub Saub { get; set; } = new();
|
public Saub Saub { get; set; } = new();
|
||||||
public Sign Sign { get; set; } = new();
|
public Sign Sign { get; set; } = new();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace AsbCloudDb.Model.DailyReport
|
namespace AsbCloudDb.Model.DailyReport
|
||||||
{
|
{
|
||||||
public class Head
|
public class Head : ItemInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// название скважины
|
/// название скважины
|
||||||
@ -26,7 +28,8 @@ namespace AsbCloudDb.Model.DailyReport
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// дата рапорта
|
/// дата рапорта
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DateTime ReportDate { get; set; }
|
[JsonConverter(typeof(DateOnlyJsonConverter))]
|
||||||
|
public DateOnly ReportDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// глубина забоя на дату начала интервала
|
/// глубина забоя на дату начала интервала
|
||||||
|
17
AsbCloudDb/Model/DailyReport/ItemInfo.cs
Normal file
17
AsbCloudDb/Model/DailyReport/ItemInfo.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AsbCloudDb.Model
|
||||||
|
{
|
||||||
|
public class ItemInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// пользователь, внесший изменения
|
||||||
|
/// </summary>
|
||||||
|
public int? IdUser { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// дата последнего обновления блока
|
||||||
|
/// </summary>
|
||||||
|
public DateTimeOffset LastUpdateDate { get; set; } = DateTimeOffset.Now;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
namespace AsbCloudDb.Model.DailyReport
|
namespace AsbCloudDb.Model.DailyReport
|
||||||
{
|
{
|
||||||
public class NoDrilling
|
public class NoDrilling : ItemInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
/// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
namespace AsbCloudDb.Model.DailyReport
|
||||||
|
|
||||||
namespace AsbCloudDb.Model.DailyReport
|
|
||||||
{
|
{
|
||||||
public class Saub
|
public class Saub : ItemInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Режимы бурения в роторе
|
/// Режимы бурения в роторе
|
||||||
@ -98,7 +96,6 @@ namespace AsbCloudDb.Model.DailyReport
|
|||||||
/// МСП
|
/// МСП
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string MspSection { get; set; } = string.Empty;
|
public string MspSection { get; set; } = string.Empty;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
namespace AsbCloudDb.Model.DailyReport
|
namespace AsbCloudDb.Model.DailyReport
|
||||||
{
|
{
|
||||||
public class Sign
|
public class Sign : ItemInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ФИО Мастера буровой
|
/// ФИО Мастера буровой
|
||||||
|
@ -1,96 +0,0 @@
|
|||||||
namespace AsbCloudDb.Model.DailyReport
|
|
||||||
{
|
|
||||||
public class TimeBalance
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Бурение
|
|
||||||
/// </summary>
|
|
||||||
public string Drilling { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Промывка
|
|
||||||
/// </summary>
|
|
||||||
public string Flushing { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Наращивание
|
|
||||||
/// </summary>
|
|
||||||
public string Building { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Проработка
|
|
||||||
/// </summary>
|
|
||||||
public string Elaboration { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Расширка
|
|
||||||
/// </summary>
|
|
||||||
public string Extension { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Ремонт
|
|
||||||
/// </summary>
|
|
||||||
public string Repair { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// КНБК
|
|
||||||
/// </summary>
|
|
||||||
public string Knbk { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// СПО
|
|
||||||
/// </summary>
|
|
||||||
public string Spo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ПЗР
|
|
||||||
/// </summary>
|
|
||||||
public string Pzr { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ПВО
|
|
||||||
/// </summary>
|
|
||||||
public string Pvo { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ПГР
|
|
||||||
/// </summary>
|
|
||||||
public string Pgr { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ГИС
|
|
||||||
/// </summary>
|
|
||||||
public string Gis { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ОЗЦ
|
|
||||||
/// </summary>
|
|
||||||
public string Ozc { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Тех. работы
|
|
||||||
/// </summary>
|
|
||||||
public string EngineeringWorks { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Снятие замера
|
|
||||||
/// </summary>
|
|
||||||
public string TakingMeasure { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Цементирование
|
|
||||||
/// </summary>
|
|
||||||
public string Cementing { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Простой
|
|
||||||
/// </summary>
|
|
||||||
public string Simple { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// НПВ
|
|
||||||
/// </summary>
|
|
||||||
public string Npv { get; set; } = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,138 +1,16 @@
|
|||||||
namespace AsbCloudDb.Model.DefaultData
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace AsbCloudDb.Model.DefaultData
|
||||||
{
|
{
|
||||||
internal class EntityFillerWellOperationCategory : EntityFiller<WellOperationCategory>
|
internal class EntityFillerWellOperationCategory : EntityFiller<WellOperationCategory>
|
||||||
{
|
{
|
||||||
public override WellOperationCategory[] GetData() => new WellOperationCategory[]{
|
|
||||||
|
|
||||||
// Этап работ
|
|
||||||
new () {Id = WellOperationCategory.IdDrilling, Name = "БУРЕНИЕ", KeyValueName = "dT", KeyValueUnits = "м/ч" },
|
|
||||||
new () {Id = 3001, Name = "СПО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 3002, Name = "КРЕПЛЕНИЕ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 3003, Name = "ГФР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 3004, Name = "Вспомогательные операции", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdNonProductiveTime, Name = "Непроизводительное время (НПВ)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
|
|
||||||
// Виды работ
|
public override WellOperationCategory[] GetData()
|
||||||
new () {Id = 4000, IdParent = 3000, Name = "КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
=> WellOperationCategory.WorkStages
|
||||||
new () {Id = WellOperationCategory.IdMechanicalDrilling, IdParent = 3000, Name = "Механическое. бурение", KeyValueName = "dT", KeyValueUnits = "м/ч" },
|
.Concat(WellOperationCategory.WorkTypes)
|
||||||
new () {Id = 4002, IdParent = 3000, Name = "Статический замер", KeyValueName = "dT", KeyValueUnits = "мин" },
|
.Concat(WellOperationCategory.WorkCategories)
|
||||||
new () {Id = 4003, IdParent = 3000, Name = "Нормализация диаметра скважины", KeyValueName = "dT", KeyValueUnits = "мин" },
|
.ToArray();
|
||||||
new () {Id = 4004, IdParent = 3000, Name = "Наращивание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4005, IdParent = 3001, Name = "СПО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4006, IdParent = 3002, Name = "Спуск обсадной колонны", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4007, IdParent = 3002, Name = "Цементирование", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4008, IdParent = 3002, Name = "Вспомогательные работы при креплении", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4009, IdParent = 3003, Name = "Сборка/разборка приборов ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4010, IdParent = 3003, Name = "СПО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4011, IdParent = 3003, Name = "ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4012, IdParent = 3004, Name = "Промывка, ОБР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4013, IdParent = 3004, Name = "Вспомогательные работы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4014, IdParent = 3005, Name = "Ремонт оборудования", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4015, IdParent = 3005, Name = "Аварийные работы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4016, IdParent = 3005, Name = "Осложнение", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 4017, IdParent = 3005, Name = "Незаложенные в ГГД операции", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
|
|
||||||
//переименованные категории с новым ИД
|
|
||||||
new () {Id = WellOperationCategory.IdBhaDisassembly, IdParent = 4000, Name = "Разборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdBhaAssembly, IdParent = 4000, Name = "Сборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdSlide, IdParent = 4001, Name = "Бурение слайдом", KeyValueName = "МСП", KeyValueUnits = "м/ч" },
|
|
||||||
new () {Id = WellOperationCategory.IdRotor, IdParent = 4001, Name = "Бурение ротором", KeyValueName = "МСП", KeyValueUnits = "м/ч" },
|
|
||||||
new () {Id = WellOperationCategory.IdStaticSurveying, IdParent = 4002, Name = "Замер ЗТС (запись MWD)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdFlashingBeforeConnection, IdParent = 4003, Name = "Промывка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5006, IdParent = 4003, Name = "Проработка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdDevelopment, IdParent = 4003, Name = "Проработка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdTemplatingWhileDrilling, IdParent = 4003, Name = "Шаблонировка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdTemplating, IdParent = 4003, Name = "Шаблонировка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5010, IdParent = 4004, Name = "Наращивание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdSlipsTime, IdParent = 4004, Name = "Удержание в клиньях", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5012, IdParent = 4005, Name = "Подъем инструмента", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdBhaUp, IdParent = 4005, Name = "Подъем КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5014, IdParent = 4005, Name = "Спуск инструмента", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdBhaDown, IdParent = 4005, Name = "Спуск КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5016, IdParent = 4006, Name = "Промывка при спуске ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdCasingDown, IdParent = 4006, Name = "Спуск ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5018, IdParent = 4007, Name = "ОЗЦ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5019, IdParent = 4007, Name = "Цементирование", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5020, IdParent = 4008, Name = "Опрессовка БИ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5021, IdParent = 4008, Name = "Опрессовка ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5022, IdParent = 4008, Name = "ПЗР при спуске ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5023, IdParent = 4008, Name = "ПЗР при цементировании", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5024, IdParent = 4009, Name = "Разборка комплекса приборов ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5025, IdParent = 4009, Name = "Сборка комплекса приборов ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5026, IdParent = 4010, Name = "Подъем приборов ГИС (на трубах)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5027, IdParent = 4010, Name = "Спуск приборов ГИС (на трубах)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5028, IdParent = 4011, Name = "Комплекс ГИС на жестком кабеле", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5029, IdParent = 4011, Name = "Комплекс ГИС на кабеле", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5030, IdParent = 4011, Name = "Комплекс ГИС на трубах", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5031, IdParent = 4012, Name = "Закачка/прокачка пачки", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5032, IdParent = 4012, Name = "Обработка БР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5033, IdParent = 4012, Name = "Ориентирование ТС при бурении", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5034, IdParent = 4012, Name = "Перезапись гаммы-каротажа", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5035, IdParent = 4012, Name = "Приготовление БР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdFlashing, IdParent = 4012, Name = "Промывка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5037, IdParent = 4012, Name = "Разбуривание тех.оснастки", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5038, IdParent = 4012, Name = "Спуск инструмента с проработкой", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5039, IdParent = 4013, Name = "ВМР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5040, IdParent = 4013, Name = "Демонтаж ПВО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5041, IdParent = 4013, Name = "Долив затруба при подъёме", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5042, IdParent = 4013, Name = "Монтаж ПВО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5043, IdParent = 4013, Name = "Наработка жёлоба", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5044, IdParent = 4013, Name = "Обвязка устья с циркуляционной системой", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5045, IdParent = 4013, Name = "Оборудование устья", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5046, IdParent = 4013, Name = "Опрессовка ПВО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5047, IdParent = 4013, Name = "Перемонтаж ПВО ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5048, IdParent = 4013, Name = "Перетяжка талевого каната", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5049, IdParent = 4013, Name = "ПЗР при сборке КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5050, IdParent = 4013, Name = "Полная замена талевого каната", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5051, IdParent = 4013, Name = "ПР перед забуркой направления", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5052, IdParent = 4013, Name = "Продувка манифольда", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5053, IdParent = 4013, Name = "Срезка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5054, IdParent = 4013, Name = "Тайм-дриллинг", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5055, IdParent = 4013, Name = "Тех.отстой", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5056, IdParent = 4013, Name = "Учебная тревога \"Выброс\"", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5057, IdParent = 4013, Name = "Чистка ЦСГО/емкостного блока", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = WellOperationCategory.IdEquipmentRepair, IdParent = 4014, Name = "Ремонт бурового оборудования", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5059, IdParent = 4015, Name = "Ловильные работы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5060, IdParent = 4015, Name = "Ожидание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5061, IdParent = 4015, Name = "Определение места прихвата и ЛМ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5062, IdParent = 4015, Name = "Работа яссом", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5063, IdParent = 4015, Name = "Расхаживание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5064, IdParent = 4015, Name = "СПО - колокол", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5065, IdParent = 4015, Name = "СПО - метчик", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5066, IdParent = 4015, Name = "СПО - овершот", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5067, IdParent = 4015, Name = "СПО - труболовка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5068, IdParent = 4015, Name = "Торпедирование (встряхивание)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5069, IdParent = 4015, Name = "Торпедирование (отстрел)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5070, IdParent = 4015, Name = "Установка ванн", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5071, IdParent = 4015, Name = "Фрезеровка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5072, IdParent = 4016, Name = "Контролируемое ГНВП", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5073, IdParent = 4016, Name = "Поглощение", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5074, IdParent = 4016, Name = "Сальникообразование", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5075, IdParent = 4016, Name = "Утяжеление БР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5076, IdParent = 4017, Name = "НПВ / прочее", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5077, IdParent = 4017, Name = "Обработка раствора (несоответствие параметров)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5078, IdParent = 4017, Name = "подъем ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5079, IdParent = 4017, Name = "Ревизия КНБК/инструмента/ЗТС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5082, IdParent = 4000, Name = "Сборка устройства ориентирования КО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5083, IdParent = 4003, Name = "Проработка принудительная", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5084, IdParent = 4005, Name = "Шаблонировка подъем БИ, продувка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5085, IdParent = 4005, Name = "Спуск бурильного инструмента со сборкой с мостков", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5086, IdParent = 4005, Name = "Подъем БИ с выбросом на мостки", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5087, IdParent = 4005, Name = "Спуск БИ со сборкой с мостков", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5088, IdParent = 4005, Name = "Сборка и спуск ТБТ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5089, IdParent = 4005, Name = "Спуск КО на транспотрной колонне", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5090, IdParent = 4008, Name = "Отворот допускной трубы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5091, IdParent = 4008, Name = "Активация подвески, опрессовка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5092, IdParent = 4008, Name = "Монтаж, опрессовка ФА", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5093, IdParent = 4008, Name = "Сборка хвостовика 114мм (согласно схеме)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5094, IdParent = 4008, Name = "ПЗР к спуску УЭЦН", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5095, IdParent = 4008, Name = "Активация подвески (потайной колонны, хвостовика)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5096, IdParent = 4008, Name = "Шаблонирование перед спуском", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5097, IdParent = 4012, Name = "Промывка - перевод скважины на новый раствор", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5098, IdParent = 4013, Name = "Сборка БИ с мостков на подсвечник", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5099, IdParent = 4013, Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО.", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5100, IdParent = 4013, Name = "Смена рабочего переводника ВСП", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
new () {Id = 5101, IdParent = 4014, Name = "Ремонт", KeyValueName = "dT", KeyValueUnits = "мин" },
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,17 +13,122 @@ namespace AsbCloudDb.Model
|
|||||||
/// БУРЕНИЕ
|
/// БУРЕНИЕ
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int IdDrilling = 3000;
|
public const int IdDrilling = 3000;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// СПО
|
||||||
|
/// </summary>
|
||||||
|
public const int IdSPOStage = 3001;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// КРЕПЛЕНИЕ
|
||||||
|
/// </summary>
|
||||||
|
public const int IdFastening = 3002;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ГФР
|
||||||
|
/// </summary>
|
||||||
|
public const int IdGFR = 3003;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вспомогательные операции
|
||||||
|
/// </summary>
|
||||||
|
public const int IdAuxiliaryOperations = 3004;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Непроизводительное время (НПВ)
|
/// Непроизводительное время (НПВ)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int IdNonProductiveTime = 3005;
|
public const int IdNonProductiveTime = 3005;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// КНБК
|
||||||
|
/// </summary>
|
||||||
|
public const int IdKnbk = 4000;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Механическое. бурение
|
/// Механическое. бурение
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int IdMechanicalDrilling = 4001;
|
public const int IdMechanicalDrilling = 4001;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Статический замер
|
||||||
|
/// </summary>
|
||||||
|
public const int IdMeasurementStat = 4002;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Нормализация диаметра скважины
|
||||||
|
/// </summary>
|
||||||
|
public const int IdNormalizedWellDiameter = 4003;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Наращивание
|
||||||
|
/// </summary>
|
||||||
|
public const int IdBuilding = 4004;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// СПО
|
||||||
|
/// </summary>
|
||||||
|
public const int IdSPO = 4005;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Спуск обсадной колонны
|
||||||
|
/// </summary>
|
||||||
|
public const int IdCasingRunning = 4006;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Цементирование
|
||||||
|
/// </summary>
|
||||||
|
public const int IdCementing = 4007;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вспомогательные работы при креплении
|
||||||
|
/// </summary>
|
||||||
|
public const int IdAuxiliaryWorkFastening = 4008;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сборка/разборка приборов ГИС
|
||||||
|
/// </summary>
|
||||||
|
public const int IdAssemblyOrDisassemblyGIS = 4009;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// СПО2
|
||||||
|
/// </summary>
|
||||||
|
public const int IdSPO2 = 4010;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ГИС
|
||||||
|
/// </summary>
|
||||||
|
public const int IdGIS = 4011;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Промывка, ОБР
|
||||||
|
/// </summary>
|
||||||
|
public const int IdFlushingOBR = 4012;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вспомогательные работы
|
||||||
|
/// </summary>
|
||||||
|
public const int IdAuxiliaryWork = 4013;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ремонт оборудования
|
||||||
|
/// </summary>
|
||||||
|
public const int IdEquipmentRepair = 4014;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Аварийные работы
|
||||||
|
/// </summary>
|
||||||
|
public const int IdEmergencyWork = 4015;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Осложнение
|
||||||
|
/// </summary>
|
||||||
|
public const int IdComplication = 4016;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Незаложенные в ГГД операции
|
||||||
|
/// </summary>
|
||||||
|
public const int IdOperationsNotIncludedGGD = 4017;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Разборка КНБК
|
/// Разборка КНБК
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -83,12 +188,13 @@ namespace AsbCloudDb.Model
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Ремонт бурового оборудования
|
/// Ремонт бурового оборудования
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int IdEquipmentRepair = 5058;
|
public const int IdEquipmentDrillingRepair = 5058;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Список всех категорий НПВ
|
/// Список всех категорий НПВ
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly int[] NonProductiveTimeSubIds = {
|
public static readonly int[] NonProductiveTimeSubIds = {
|
||||||
IdEquipmentRepair,
|
IdEquipmentDrillingRepair,
|
||||||
5059,
|
5059,
|
||||||
5060,
|
5060,
|
||||||
5061,
|
5061,
|
||||||
@ -123,6 +229,150 @@ namespace AsbCloudDb.Model
|
|||||||
public static readonly int[] MechanicalDrillingSubIds = { IdRotor, IdSlide, IdMechanicalDrilling, };
|
public static readonly int[] MechanicalDrillingSubIds = { IdRotor, IdSlide, IdMechanicalDrilling, };
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Списки категорий операций по группам
|
||||||
|
/// <summary>
|
||||||
|
/// Этапы работ
|
||||||
|
/// </summary>
|
||||||
|
public static WellOperationCategory[] WorkStages { get; } = new WellOperationCategory[]{
|
||||||
|
new() { Id = IdDrilling, Name = "БУРЕНИЕ", KeyValueName = "dT", KeyValueUnits = "м/ч" },
|
||||||
|
new() { Id = IdSPOStage, Name = "СПО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new() { Id = IdFastening, Name = "КРЕПЛЕНИЕ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new() { Id = IdGFR, Name = "ГФР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new() { Id = IdAuxiliaryOperations, Name = "Вспомогательные операции", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new() { Id = IdNonProductiveTime, Name = "Непроизводительное время (НПВ)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Виды работ
|
||||||
|
/// </summary>
|
||||||
|
public static WellOperationCategory[] WorkTypes { get; } = new WellOperationCategory[]{
|
||||||
|
new () {Id = IdKnbk, IdParent = 3000, Name = "КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdMechanicalDrilling, IdParent = 3000, Name = "Механическое. бурение", KeyValueName = "dT", KeyValueUnits = "м/ч" },
|
||||||
|
new () {Id = IdMeasurementStat, IdParent = 3000, Name = "Статический замер", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdNormalizedWellDiameter, IdParent = 3000, Name = "Нормализация диаметра скважины", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdBuilding, IdParent = 3000, Name = "Наращивание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdSPO , IdParent = 3001, Name = "СПО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdCasingRunning, IdParent = 3002, Name = "Спуск обсадной колонны", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdCementing, IdParent = 3002, Name = "Цементирование", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdAuxiliaryWorkFastening, IdParent = 3002, Name = "Вспомогательные работы при креплении", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdAssemblyOrDisassemblyGIS, IdParent = 3003, Name = "Сборка/разборка приборов ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdSPO2, IdParent = 3003, Name = "СПО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdGIS, IdParent = 3003, Name = "ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdFlushingOBR, IdParent = 3004, Name = "Промывка, ОБР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdAuxiliaryWork, IdParent = 3004, Name = "Вспомогательные работы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdEquipmentRepair, IdParent = 3005, Name = "Ремонт оборудования", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdEmergencyWork, IdParent = 3005, Name = "Аварийные работы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdComplication, IdParent = 3005, Name = "Осложнение", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdOperationsNotIncludedGGD, IdParent = 3005, Name = "Незаложенные в ГГД операции", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Категории работ
|
||||||
|
/// </summary>
|
||||||
|
public static WellOperationCategory[] WorkCategories { get; } = new WellOperationCategory[]{
|
||||||
|
new () {Id = IdBhaDisassembly, IdParent = 4000, Name = "Разборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdBhaAssembly, IdParent = 4000, Name = "Сборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdSlide, IdParent = 4001, Name = "Бурение слайдом", KeyValueName = "МСП", KeyValueUnits = "м/ч" },
|
||||||
|
new () {Id = IdRotor, IdParent = 4001, Name = "Бурение ротором", KeyValueName = "МСП", KeyValueUnits = "м/ч" },
|
||||||
|
new () {Id = IdStaticSurveying, IdParent = 4002, Name = "Замер ЗТС (запись MWD)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdFlashingBeforeConnection, IdParent = 4003, Name = "Промывка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5006, IdParent = 4003, Name = "Проработка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdDevelopment, IdParent = 4003, Name = "Проработка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdTemplatingWhileDrilling, IdParent = 4003, Name = "Шаблонировка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdTemplating, IdParent = 4003, Name = "Шаблонировка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5010, IdParent = 4004, Name = "Наращивание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdSlipsTime, IdParent = 4004, Name = "Удержание в клиньях", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5012, IdParent = 4005, Name = "Подъем инструмента", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdBhaUp, IdParent = 4005, Name = "Подъем КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5014, IdParent = 4005, Name = "Спуск инструмента", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdBhaDown, IdParent = 4005, Name = "Спуск КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5016, IdParent = 4006, Name = "Промывка при спуске ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdCasingDown, IdParent = 4006, Name = "Спуск ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5018, IdParent = 4007, Name = "ОЗЦ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5019, IdParent = 4007, Name = "Цементирование", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5020, IdParent = 4008, Name = "Опрессовка БИ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5021, IdParent = 4008, Name = "Опрессовка ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5022, IdParent = 4008, Name = "ПЗР при спуске ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5023, IdParent = 4008, Name = "ПЗР при цементировании", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5024, IdParent = 4009, Name = "Разборка комплекса приборов ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5025, IdParent = 4009, Name = "Сборка комплекса приборов ГИС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5026, IdParent = 4010, Name = "Подъем приборов ГИС (на трубах)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5027, IdParent = 4010, Name = "Спуск приборов ГИС (на трубах)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5028, IdParent = 4011, Name = "Комплекс ГИС на жестком кабеле", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5029, IdParent = 4011, Name = "Комплекс ГИС на кабеле", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5030, IdParent = 4011, Name = "Комплекс ГИС на трубах", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5031, IdParent = 4012, Name = "Закачка/прокачка пачки", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5032, IdParent = 4012, Name = "Обработка БР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5033, IdParent = 4012, Name = "Ориентирование ТС при бурении", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5034, IdParent = 4012, Name = "Перезапись гаммы-каротажа", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5035, IdParent = 4012, Name = "Приготовление БР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdFlashing, IdParent = 4012, Name = "Промывка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5037, IdParent = 4012, Name = "Разбуривание тех.оснастки", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5038, IdParent = 4012, Name = "Спуск инструмента с проработкой", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5039, IdParent = 4013, Name = "ВМР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5040, IdParent = 4013, Name = "Демонтаж ПВО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5041, IdParent = 4013, Name = "Долив затруба при подъёме", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5042, IdParent = 4013, Name = "Монтаж ПВО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5043, IdParent = 4013, Name = "Наработка жёлоба", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5044, IdParent = 4013, Name = "Обвязка устья с циркуляционной системой", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5045, IdParent = 4013, Name = "Оборудование устья", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5046, IdParent = 4013, Name = "Опрессовка ПВО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5047, IdParent = 4013, Name = "Перемонтаж ПВО ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5048, IdParent = 4013, Name = "Перетяжка талевого каната", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5049, IdParent = 4013, Name = "ПЗР при сборке КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5050, IdParent = 4013, Name = "Полная замена талевого каната", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5051, IdParent = 4013, Name = "ПР перед забуркой направления", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5052, IdParent = 4013, Name = "Продувка манифольда", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5053, IdParent = 4013, Name = "Срезка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5054, IdParent = 4013, Name = "Тайм-дриллинг", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5055, IdParent = 4013, Name = "Тех.отстой", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5056, IdParent = 4013, Name = "Учебная тревога \"Выброс\"", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5057, IdParent = 4013, Name = "Чистка ЦСГО/емкостного блока", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = IdEquipmentDrillingRepair, IdParent = 4014, Name = "Ремонт бурового оборудования", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5059, IdParent = 4015, Name = "Ловильные работы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5060, IdParent = 4015, Name = "Ожидание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5061, IdParent = 4015, Name = "Определение места прихвата и ЛМ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5062, IdParent = 4015, Name = "Работа яссом", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5063, IdParent = 4015, Name = "Расхаживание", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5064, IdParent = 4015, Name = "СПО - колокол", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5065, IdParent = 4015, Name = "СПО - метчик", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5066, IdParent = 4015, Name = "СПО - овершот", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5067, IdParent = 4015, Name = "СПО - труболовка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5068, IdParent = 4015, Name = "Торпедирование (встряхивание)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5069, IdParent = 4015, Name = "Торпедирование (отстрел)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5070, IdParent = 4015, Name = "Установка ванн", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5071, IdParent = 4015, Name = "Фрезеровка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5072, IdParent = 4016, Name = "Контролируемое ГНВП", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5073, IdParent = 4016, Name = "Поглощение", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5074, IdParent = 4016, Name = "Сальникообразование", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5075, IdParent = 4016, Name = "Утяжеление БР", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5076, IdParent = 4017, Name = "НПВ / прочее", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5077, IdParent = 4017, Name = "Обработка раствора (несоответствие параметров)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5078, IdParent = 4017, Name = "подъем ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5079, IdParent = 4017, Name = "Ревизия КНБК/инструмента/ЗТС", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5082, IdParent = 4000, Name = "Сборка устройства ориентирования КО", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5083, IdParent = 4003, Name = "Проработка принудительная", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5084, IdParent = 4005, Name = "Шаблонировка подъем БИ, продувка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5085, IdParent = 4005, Name = "Спуск бурильного инструмента со сборкой с мостков", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5086, IdParent = 4005, Name = "Подъем БИ с выбросом на мостки", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5087, IdParent = 4005, Name = "Спуск БИ со сборкой с мостков", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5088, IdParent = 4005, Name = "Сборка и спуск ТБТ", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5089, IdParent = 4005, Name = "Спуск КО на транспотрной колонне", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5090, IdParent = 4008, Name = "Отворот допускной трубы", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5091, IdParent = 4008, Name = "Активация подвески, опрессовка", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5092, IdParent = 4008, Name = "Монтаж, опрессовка ФА", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5093, IdParent = 4008, Name = "Сборка хвостовика 114мм (согласно схеме)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5094, IdParent = 4008, Name = "ПЗР к спуску УЭЦН", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5095, IdParent = 4008, Name = "Активация подвески (потайной колонны, хвостовика)", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5096, IdParent = 4008, Name = "Шаблонирование перед спуском", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5097, IdParent = 4012, Name = "Промывка - перевод скважины на новый раствор", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5098, IdParent = 4013, Name = "Сборка БИ с мостков на подсвечник", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5099, IdParent = 4013, Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО.", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5100, IdParent = 4013, Name = "Смена рабочего переводника ВСП", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
new () {Id = 5101, IdParent = 4014, Name = "Ремонт", KeyValueName = "dT", KeyValueUnits = "мин" },
|
||||||
|
};
|
||||||
|
#endregion
|
||||||
|
|
||||||
[Key]
|
[Key]
|
||||||
[Column("id")]
|
[Column("id")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
@ -21,7 +21,7 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
this.wellService = wellService;
|
this.wellService = wellService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DrillerDto?> GetDrillerAsync(int idWell, DateTime workTime, CancellationToken token)
|
public async Task<DrillerDto?> GetOrDefaultDrillerAsync(int idWell, DateTime workTime, CancellationToken token)
|
||||||
{
|
{
|
||||||
var hoursOffset = wellService.GetTimezone(idWell).Hours;
|
var hoursOffset = wellService.GetTimezone(idWell).Hours;
|
||||||
var date = workTime.ToUtcDateTimeOffset(hoursOffset);
|
var date = workTime.ToUtcDateTimeOffset(hoursOffset);
|
||||||
|
@ -331,10 +331,10 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
query = query.Where(e => e.DateStart >= geDateOffset);
|
query = query.Where(e => e.DateStart >= geDateOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.LeDate.HasValue)
|
if (request.LtDate.HasValue)
|
||||||
{
|
{
|
||||||
var leDateOffset = request.LeDate.Value.ToUtcDateTimeOffset(timezone.Hours);
|
var ltDateOffset = request.LtDate.Value.ToUtcDateTimeOffset(timezone.Hours);
|
||||||
query = query.Where(e => e.DateStart <= leDateOffset);
|
query = query.Where(e => e.DateStart < ltDateOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentWellOperations = db.WellOperations
|
var currentWellOperations = db.WellOperations
|
||||||
@ -352,6 +352,7 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
IdWell = o.IdWell,
|
IdWell = o.IdWell,
|
||||||
IdWellSectionType = o.IdWellSectionType,
|
IdWellSectionType = o.IdWellSectionType,
|
||||||
IdCategory = o.IdCategory,
|
IdCategory = o.IdCategory,
|
||||||
|
IdParentCategory = o.OperationCategory.IdParent,
|
||||||
|
|
||||||
CategoryName = o.OperationCategory.Name,
|
CategoryName = o.OperationCategory.Name,
|
||||||
WellSectionTypeName = o.WellSectionType.Caption,
|
WellSectionTypeName = o.WellSectionType.Caption,
|
||||||
|
@ -1,175 +1,93 @@
|
|||||||
using AsbCloudApp.Data.DailyReport;
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudApp.Data.DailyReport;
|
||||||
using ClosedXML.Excel;
|
using ClosedXML.Excel;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
namespace AsbCloudInfrastructure.Services.DailyReport.DailyReportBlocks
|
namespace AsbCloudInfrastructure.Services.DailyReport.DailyReportBlocks
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Построение баланса времени
|
||||||
|
/// </summary>
|
||||||
class TimeBalanceBlock : BlockAbstract
|
class TimeBalanceBlock : BlockAbstract
|
||||||
{
|
{
|
||||||
private readonly TimeBalanceDto blockDto;
|
/// <summary>
|
||||||
public CellAddress AddressTitle { get; }
|
/// Начальная ячейка
|
||||||
public CellAddress AddressDrilling { get; set; }
|
/// </summary>
|
||||||
public CellAddress AddressFlushing { get; set; }
|
|
||||||
public CellAddress AddressBuilding { get; set; }
|
|
||||||
public CellAddress AddressElaboration { get; set; }
|
|
||||||
public CellAddress AddressExtension { get; set; }
|
|
||||||
public CellAddress AddressRepair { get; set; }
|
|
||||||
public CellAddress AddressDrillingValue { get; set; }
|
|
||||||
public CellAddress AddressFlushingValue { get; set; }
|
|
||||||
public CellAddress AddressBuildingValue { get; set; }
|
|
||||||
public CellAddress AddressElaborationValue { get; set; }
|
|
||||||
public CellAddress AddressExtensionValue { get; set; }
|
|
||||||
public CellAddress AddressRepairValue { get; set; }
|
|
||||||
public CellAddress AddressKnbk { get; set; }
|
|
||||||
public CellAddress AddressSpo { get; set; }
|
|
||||||
public CellAddress AddressPzr { get; set; }
|
|
||||||
public CellAddress AddressPvo { get; set; }
|
|
||||||
public CellAddress AddressPgr { get; set; }
|
|
||||||
public CellAddress AddressGis { get; set; }
|
|
||||||
public CellAddress AddressKnbkValue { get; set; }
|
|
||||||
public CellAddress AddressSpoValue { get; set; }
|
|
||||||
public CellAddress AddressPzrValue { get; set; }
|
|
||||||
public CellAddress AddressPvoValue { get; set; }
|
|
||||||
public CellAddress AddressPgrValue { get; set; }
|
|
||||||
public CellAddress AddressGisValue { get; set; }
|
|
||||||
public CellAddress AddressOzc { get; set; }
|
|
||||||
public CellAddress AddressEngineeringWorks { get; set; }
|
|
||||||
public CellAddress AddressTakingMeasure { get; set; }
|
|
||||||
public CellAddress AddressCementing { get; set; }
|
|
||||||
public CellAddress AddressSimple { get; set; }
|
|
||||||
public CellAddress AddressNpv { get; set; }
|
|
||||||
public CellAddress AddressOzcValue { get; set; }
|
|
||||||
public CellAddress AddressEngineeringWorksValue { get; set; }
|
|
||||||
public CellAddress AddressTakingMeasureValue { get; set; }
|
|
||||||
public CellAddress AddressCementingValue { get; set; }
|
|
||||||
public CellAddress AddressSimpleValue { get; set; }
|
|
||||||
public CellAddress AddressNpvValue { get; set; }
|
|
||||||
public CellAddress[] AddressPeriodTableDataArray { get; }
|
|
||||||
public override CellAddress AddressBlockBegin { get; }
|
public override CellAddress AddressBlockBegin { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конечная ячейка
|
||||||
|
/// </summary>
|
||||||
public override CellAddress AddressBlockEnd { get; }
|
public override CellAddress AddressBlockEnd { get; }
|
||||||
|
|
||||||
public TimeBalanceBlock(CellAddress addressBlockBegin, TimeBalanceDto blockDto)
|
/// <summary>
|
||||||
|
/// Ячейка с заголовком
|
||||||
|
/// </summary>
|
||||||
|
private CellAddress Title { get { return AddressBlockBegin + (1, 3); } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Статистика по операциям
|
||||||
|
/// </summary>
|
||||||
|
private Dictionary<int, double> OperationsStatistics { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Категории операций
|
||||||
|
/// </summary>
|
||||||
|
private IEnumerable<WellOperationCategoryDto> OperationCategories { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// количество столбцов в таблице
|
||||||
|
/// </summary>
|
||||||
|
private const int countColumns = 3;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// количество категорий операций
|
||||||
|
/// </summary>
|
||||||
|
private int OperationCategoriesCount { get { return OperationCategories.Count(); } }
|
||||||
|
|
||||||
|
|
||||||
|
public TimeBalanceBlock(CellAddress addressBlockBegin, TimeBalanceDto blockDto, IEnumerable<WellOperationCategoryDto> operationCategories)
|
||||||
{
|
{
|
||||||
AddressBlockBegin = addressBlockBegin.Copy();
|
AddressBlockBegin = addressBlockBegin.Copy();
|
||||||
this.blockDto = blockDto;
|
|
||||||
AddressTitle = addressBlockBegin + (1, 3);
|
OperationsStatistics = blockDto.OperationsStat;
|
||||||
AddressDrilling = addressBlockBegin + (2, 1);
|
OperationCategories = operationCategories;
|
||||||
AddressFlushing = addressBlockBegin + (3, 1);
|
|
||||||
AddressBuilding = addressBlockBegin + (4, 1);
|
var rowsCount = (int)Math.Ceiling( 1d * OperationCategoriesCount / countColumns);
|
||||||
AddressElaboration = addressBlockBegin + (5, 1);
|
var colsCount = (1 + 1) * countColumns;
|
||||||
AddressExtension = addressBlockBegin + (6, 1);
|
AddressBlockEnd = Title + (rowsCount, colsCount);
|
||||||
AddressRepair = addressBlockBegin + (7, 1);
|
|
||||||
AddressDrillingValue = addressBlockBegin + (2, 2);
|
|
||||||
AddressFlushingValue = addressBlockBegin + (3, 2);
|
|
||||||
AddressBuildingValue = addressBlockBegin + (4, 2);
|
|
||||||
AddressElaborationValue = addressBlockBegin + (5, 2);
|
|
||||||
AddressExtensionValue = addressBlockBegin + (6, 2);
|
|
||||||
AddressRepairValue = addressBlockBegin + (7, 2);
|
|
||||||
AddressKnbk = addressBlockBegin + (2, 3);
|
|
||||||
AddressSpo = addressBlockBegin + (3, 3);
|
|
||||||
AddressPzr = addressBlockBegin + (4, 3);
|
|
||||||
AddressPvo = addressBlockBegin + (5, 3);
|
|
||||||
AddressPgr = addressBlockBegin + (6, 3);
|
|
||||||
AddressGis = addressBlockBegin + (7, 3);
|
|
||||||
AddressKnbkValue = addressBlockBegin + (2, 4);
|
|
||||||
AddressSpoValue = addressBlockBegin + (3, 4);
|
|
||||||
AddressPzrValue = addressBlockBegin + (4, 4);
|
|
||||||
AddressPvoValue = addressBlockBegin + (5, 4);
|
|
||||||
AddressPgrValue = addressBlockBegin + (6, 4);
|
|
||||||
AddressGisValue = addressBlockBegin + (7, 4);
|
|
||||||
AddressOzc = addressBlockBegin + (2, 5);
|
|
||||||
AddressEngineeringWorks = addressBlockBegin + (3, 5);
|
|
||||||
AddressTakingMeasure = addressBlockBegin + (4, 5);
|
|
||||||
AddressCementing = addressBlockBegin + (5, 5);
|
|
||||||
AddressSimple = addressBlockBegin + (6, 5);
|
|
||||||
AddressNpv = addressBlockBegin + (7, 5);
|
|
||||||
AddressOzcValue = addressBlockBegin + (2, 6);
|
|
||||||
AddressEngineeringWorksValue = addressBlockBegin + (3, 6);
|
|
||||||
AddressTakingMeasureValue = addressBlockBegin + (4, 6);
|
|
||||||
AddressCementingValue = addressBlockBegin + (5, 6);
|
|
||||||
AddressSimpleValue = addressBlockBegin + (6, 6);
|
|
||||||
AddressNpvValue = addressBlockBegin + (7, 6);
|
|
||||||
AddressBlockEnd = AddressNpvValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Draw(IXLWorksheet sheet)
|
public override void Draw(IXLWorksheet sheet)
|
||||||
{
|
{
|
||||||
sheet.Range(AddressTitle.RowNumber, AddressTitle.ColumnNumber, AddressTitle.RowNumber, AddressTitle.ColumnNumber + 1)
|
sheet.Range(Title.RowNumber, Title.ColumnNumber, Title.RowNumber, Title.ColumnNumber + 1)
|
||||||
.Merge()
|
.Merge()
|
||||||
.SetValue("БАЛАНС ВРЕМЕНИ");
|
.SetValue("БАЛАНС ВРЕМЕНИ");
|
||||||
sheet.Cell(AddressDrilling)
|
|
||||||
._SetValue("Бурение", true);
|
var i = 0;
|
||||||
sheet.Cell(AddressFlushing)
|
|
||||||
._SetValue("Промывка", true);
|
foreach (var operationCategory in OperationCategories)
|
||||||
sheet.Cell(AddressBuilding)
|
{
|
||||||
._SetValue("Наращивание", true);
|
var row = 2 + (int)Math.Floor(1d * i / countColumns);
|
||||||
sheet.Cell(AddressElaboration)
|
var col = 1 + 2 *(i % countColumns);
|
||||||
._SetValue("Проработка", true);
|
i++;
|
||||||
sheet.Cell(AddressExtension)
|
|
||||||
._SetValue("Расширка", true);
|
sheet.Cell(AddressBlockBegin + (row, col))
|
||||||
sheet.Cell(AddressRepair)
|
._SetValue(operationCategory.Name, true);
|
||||||
._SetValue("Ремонт", true);
|
sheet.Cell(AddressBlockBegin + (row, col + 1))
|
||||||
sheet.Cell(AddressDrillingValue)
|
._SetValue(GetValue(operationCategory.Id), true);
|
||||||
._SetValue($"{blockDto.Drilling}");
|
}
|
||||||
sheet.Cell(AddressFlushingValue)
|
}
|
||||||
._SetValue($"{blockDto.Flushing}");
|
|
||||||
sheet.Cell(AddressBuildingValue)
|
private string GetValue(int categoryId)
|
||||||
._SetValue($"{blockDto.Building}");
|
{
|
||||||
sheet.Cell(AddressElaborationValue)
|
if (OperationsStatistics.TryGetValue(categoryId, out double duration))
|
||||||
._SetValue($"{blockDto.Elaboration}");
|
return $"{duration}";
|
||||||
sheet.Cell(AddressExtensionValue)
|
return "0";
|
||||||
._SetValue($"{blockDto.Extension}");
|
|
||||||
sheet.Cell(AddressRepairValue)
|
|
||||||
._SetValue($"{blockDto.Repair}");
|
|
||||||
sheet.Cell(AddressKnbk)
|
|
||||||
._SetValue("КНБК");
|
|
||||||
sheet.Cell(AddressSpo)
|
|
||||||
._SetValue("СПО");
|
|
||||||
sheet.Cell(AddressPzr)
|
|
||||||
._SetValue("ПЗР");
|
|
||||||
sheet.Cell(AddressPvo)
|
|
||||||
._SetValue("ПВО");
|
|
||||||
sheet.Cell(AddressPgr)
|
|
||||||
._SetValue("ПГР");
|
|
||||||
sheet.Cell(AddressGis)
|
|
||||||
._SetValue("ГИС");
|
|
||||||
sheet.Cell(AddressKnbkValue)
|
|
||||||
._SetValue($"{blockDto.Knbk}");
|
|
||||||
sheet.Cell(AddressSpoValue)
|
|
||||||
._SetValue($"{blockDto.Spo}");
|
|
||||||
sheet.Cell(AddressPzrValue)
|
|
||||||
._SetValue($"{blockDto.Pzr}");
|
|
||||||
sheet.Cell(AddressPvoValue)
|
|
||||||
._SetValue($"{blockDto.Pvo}");
|
|
||||||
sheet.Cell(AddressPgrValue)
|
|
||||||
._SetValue($"{blockDto.Pgr}");
|
|
||||||
sheet.Cell(AddressGisValue)
|
|
||||||
._SetValue($"{blockDto.Gis}");
|
|
||||||
sheet.Cell(AddressOzc)
|
|
||||||
._SetValue("ОЗЦ");
|
|
||||||
sheet.Cell(AddressEngineeringWorks)
|
|
||||||
._SetValue("Тех. работы");
|
|
||||||
sheet.Cell(AddressTakingMeasure)
|
|
||||||
._SetValue("Снятие замера");
|
|
||||||
sheet.Cell(AddressCementing)
|
|
||||||
._SetValue("Цементирование");
|
|
||||||
sheet.Cell(AddressSimple)
|
|
||||||
._SetValue("Простой");
|
|
||||||
sheet.Cell(AddressNpv)
|
|
||||||
._SetValue("НПВ");
|
|
||||||
sheet.Cell(AddressOzcValue)
|
|
||||||
._SetValue($"{blockDto.Ozc}");
|
|
||||||
sheet.Cell(AddressEngineeringWorksValue)
|
|
||||||
._SetValue($"{blockDto.EngineeringWorks}");
|
|
||||||
sheet.Cell(AddressTakingMeasureValue)
|
|
||||||
._SetValue($"{blockDto.TakingMeasure}");
|
|
||||||
sheet.Cell(AddressCementingValue)
|
|
||||||
._SetValue($"{blockDto.Cementing}");
|
|
||||||
sheet.Cell(AddressSimpleValue)
|
|
||||||
._SetValue($"{blockDto.Simple}");
|
|
||||||
sheet.Cell(AddressNpvValue)
|
|
||||||
._SetValue($"{blockDto.Npv}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#nullable disable
|
||||||
|
@ -1,15 +1,21 @@
|
|||||||
using AsbCloudApp.Data.DailyReport;
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudApp.Data.DailyReport;
|
||||||
using AsbCloudInfrastructure.Services.DailyReport.DailyReportBlocks;
|
using AsbCloudInfrastructure.Services.DailyReport.DailyReportBlocks;
|
||||||
using ClosedXML.Excel;
|
using ClosedXML.Excel;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
namespace AsbCloudInfrastructure.Services.DailyReport
|
namespace AsbCloudInfrastructure.Services.DailyReport
|
||||||
{
|
{
|
||||||
public class DailyReportMakerExcel
|
public class DailyReportMakerExcel
|
||||||
{
|
{
|
||||||
public Stream MakeReportFromBlocks(DailyReportDto dto)
|
private IEnumerable<WellOperationCategoryDto> OperationCategories;
|
||||||
|
|
||||||
|
public Stream MakeReportFromBlocks(DailyReportDto dto, IEnumerable<WellOperationCategoryDto> operationCategories)
|
||||||
{
|
{
|
||||||
|
OperationCategories = operationCategories;
|
||||||
|
|
||||||
using var workbook = new XLWorkbook();
|
using var workbook = new XLWorkbook();
|
||||||
FillExampleBlocks(workbook, dto);
|
FillExampleBlocks(workbook, dto);
|
||||||
MemoryStream memoryStream = new MemoryStream();
|
MemoryStream memoryStream = new MemoryStream();
|
||||||
workbook.SaveAs(memoryStream, new SaveOptions { });
|
workbook.SaveAs(memoryStream, new SaveOptions { });
|
||||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||||
@ -26,7 +32,7 @@ namespace AsbCloudInfrastructure.Services.DailyReport
|
|||||||
var blockBha = new BhaBlock(addressStart, dto.Bha);
|
var blockBha = new BhaBlock(addressStart, dto.Bha);
|
||||||
addressStart = blockBha.AddressBlockEnd + (1, 0);
|
addressStart = blockBha.AddressBlockEnd + (1, 0);
|
||||||
addressStart.ColumnNumber = 2;
|
addressStart.ColumnNumber = 2;
|
||||||
var timeBalance = new TimeBalanceBlock(addressStart, dto.TimeBalance);
|
var timeBalance = new TimeBalanceBlock(addressStart, dto.TimeBalance, OperationCategories);
|
||||||
addressStart = timeBalance.AddressBlockEnd + (1, 0);
|
addressStart = timeBalance.AddressBlockEnd + (1, 0);
|
||||||
addressStart.ColumnNumber = 2;
|
addressStart.ColumnNumber = 2;
|
||||||
var blockDimensionless = new DimensionlessBlock(addressStart, dto.NoDrilling);
|
var blockDimensionless = new DimensionlessBlock(addressStart, dto.NoDrilling);
|
||||||
@ -47,7 +53,7 @@ namespace AsbCloudInfrastructure.Services.DailyReport
|
|||||||
blockSign.Draw(sheet);
|
blockSign.Draw(sheet);
|
||||||
//sheet.Columns().AdjustToContents(); // Adjust column width
|
//sheet.Columns().AdjustToContents(); // Adjust column width
|
||||||
sheet.Rows().AdjustToContents();
|
sheet.Rows().AdjustToContents();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,15 +1,19 @@
|
|||||||
using System;
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudApp.Data.DailyReport;
|
||||||
|
using AsbCloudApp.Exceptions;
|
||||||
|
using AsbCloudApp.Repositories;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
using AsbCloudApp.Services;
|
||||||
|
using AsbCloudDb.Model;
|
||||||
|
using AsbCloudDb.Model.DailyReport;
|
||||||
|
using Mapster;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Mapster;
|
|
||||||
using AsbCloudApp.Services;
|
|
||||||
using AsbCloudDb.Model;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using AsbCloudApp.Data.DailyReport;
|
|
||||||
using AsbCloudApp.Exceptions;
|
|
||||||
|
|
||||||
namespace AsbCloudInfrastructure.Services.DailyReport
|
namespace AsbCloudInfrastructure.Services.DailyReport
|
||||||
{
|
{
|
||||||
@ -17,16 +21,25 @@ namespace AsbCloudInfrastructure.Services.DailyReport
|
|||||||
public class DailyReportService : IDailyReportService
|
public class DailyReportService : IDailyReportService
|
||||||
{
|
{
|
||||||
private readonly IAsbCloudDbContext db;
|
private readonly IAsbCloudDbContext db;
|
||||||
|
private readonly IUserRepository userRepository;
|
||||||
|
private readonly IWellOperationRepository wellOperationRepository;
|
||||||
private readonly IWellService wellService;
|
private readonly IWellService wellService;
|
||||||
private readonly DailyReportMakerExcel dailyReportMaker = new DailyReportMakerExcel();
|
private readonly DailyReportMakerExcel dailyReportMaker = new DailyReportMakerExcel();
|
||||||
|
|
||||||
public DailyReportService(IAsbCloudDbContext db, IWellService wellService)
|
public DailyReportService(
|
||||||
|
IAsbCloudDbContext db,
|
||||||
|
IWellService wellService,
|
||||||
|
IUserRepository userRepository,
|
||||||
|
IWellOperationRepository wellOperationRepository)
|
||||||
{
|
{
|
||||||
this.db = db;
|
this.db = db;
|
||||||
this.wellService = wellService;
|
this.wellService = wellService;
|
||||||
|
this.userRepository = userRepository;
|
||||||
|
this.wellOperationRepository = wellOperationRepository;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<DailyReportDto>> GetListAsync(int idWell, DateTime? begin, DateTime? end, CancellationToken token)
|
public async Task<IEnumerable<DailyReportDto>> GetListAsync(int idWell, DateOnly? begin, DateOnly? end, CancellationToken token)
|
||||||
{
|
{
|
||||||
var well = wellService.GetOrDefault(idWell);
|
var well = wellService.GetOrDefault(idWell);
|
||||||
if (well is null || well.Timezone is null)
|
if (well is null || well.Timezone is null)
|
||||||
@ -34,142 +47,196 @@ namespace AsbCloudInfrastructure.Services.DailyReport
|
|||||||
|
|
||||||
var query = db.DailyReports.Where(r => r.IdWell == idWell);
|
var query = db.DailyReports.Where(r => r.IdWell == idWell);
|
||||||
|
|
||||||
DateTimeOffset ExtractDate(DateTime dateTime)
|
|
||||||
{
|
|
||||||
var dateTimeOffset = dateTime.ToUtcDateTimeOffset(well!.Timezone.Hours);
|
|
||||||
var date = new DateTimeOffset(dateTimeOffset.Year, dateTimeOffset.Month, dateTimeOffset.Day, 0,0,0,TimeSpan.Zero);
|
|
||||||
return date;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (begin is not null)
|
if (begin is not null)
|
||||||
{
|
{
|
||||||
var beginUTC = ExtractDate(begin.Value);
|
query = query.Where(d => d.StartDate >= begin);
|
||||||
query = query.Where(d => d.StartDate >= beginUTC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end is not null)
|
if (end is not null)
|
||||||
{
|
{
|
||||||
var endUTC = ExtractDate(end.Value);
|
query = query.Where(d => d.StartDate <= end);
|
||||||
query = query.Where(d => d.StartDate <= endUTC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var entities = await query
|
var entities = await query.OrderByDescending(e => e.StartDate)
|
||||||
.OrderBy(e => e.StartDate)
|
.AsNoTracking()
|
||||||
.ToListAsync(token);
|
.ToArrayAsync(token)
|
||||||
return entities.Select(r => Convert(r));
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
var factOperationsForDtos = await GetFactOperationsForDailyReportAsync(idWell, token);
|
||||||
|
var userDtos = await userRepository.GetAllAsync(token);
|
||||||
|
|
||||||
|
var dtos = entities.Select(entity => Convert(entity, factOperationsForDtos, userDtos));
|
||||||
|
return dtos;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DailyReportDto> GetOrGenerateAsync(int idWell, DateTime date, CancellationToken token)
|
/// <summary>
|
||||||
|
/// Получение фактических операций для суточного рапорта
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task<IEnumerable<WellOperationDto>> GetFactOperationsForDailyReportAsync(int idWell, CancellationToken token)
|
||||||
{
|
{
|
||||||
var dateOnly = DateTime.SpecifyKind(date.Date, DateTimeKind.Utc);
|
var request = new WellOperationRequest()
|
||||||
var dailyReportDto = await GetOrDefaultAsync(idWell, dateOnly, token);
|
{
|
||||||
dailyReportDto ??= await MakeDefaultDailyReportAsync(idWell, dateOnly, token);
|
IdWell = idWell,
|
||||||
return dailyReportDto;
|
OperationType = WellOperation.IdOperationTypeFact,
|
||||||
|
};
|
||||||
|
|
||||||
|
var factOperations = await wellOperationRepository.GetAsync(request, token);
|
||||||
|
return factOperations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> AddAsync(int idWell, DailyReportDto dto, CancellationToken token = default)
|
public async Task<int> AddAsync(int idWell, DateOnly startDate, int idUser, CancellationToken token)
|
||||||
{
|
{
|
||||||
var info = Convert(dto);
|
var well = wellService.GetOrDefault(idWell);
|
||||||
|
if (well is null)
|
||||||
|
throw new ArgumentInvalidException("idWell doesn`t exist", nameof(idWell));
|
||||||
|
|
||||||
|
|
||||||
|
var hasEntity = await db.DailyReports
|
||||||
|
.AnyAsync(r => r.IdWell == idWell && r.StartDate == startDate, token);
|
||||||
|
if (hasEntity)
|
||||||
|
throw new ArgumentInvalidException($"daily report on {startDate} already exists", nameof(startDate));
|
||||||
|
|
||||||
var entity = new AsbCloudDb.Model.DailyReport.DailyReport
|
var entity = new AsbCloudDb.Model.DailyReport.DailyReport
|
||||||
{
|
{
|
||||||
IdWell = idWell,
|
IdWell = idWell,
|
||||||
StartDate = info.Head.ReportDate,
|
StartDate = startDate,
|
||||||
Info = info
|
Info = new DailyReportInfo()
|
||||||
|
{
|
||||||
|
Head = CreateHeadDailyReportBlock(well, startDate, idUser)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
db.DailyReports.Add(entity);
|
db.DailyReports.Add(entity);
|
||||||
var result = await db.SaveChangesAsync(token);
|
var result = await db.SaveChangesAsync(token);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> UpdateAsync(int idWell, DateTime date, DailyReportDto dto, CancellationToken token)
|
public async Task<int> UpdateBlockAsync(int idWell, DateOnly startDate, ItemInfoDto dto, CancellationToken token)
|
||||||
{
|
{
|
||||||
var dateOffset = date.Date;
|
var well = wellService.GetOrDefault(idWell);
|
||||||
var entity = await db.DailyReports
|
if (well is null)
|
||||||
.FirstOrDefaultAsync(r => r.IdWell == idWell &&
|
throw new ArgumentInvalidException("idWell doesn`t exist", nameof(idWell));
|
||||||
r.StartDate.Year == dateOffset.Year &&
|
|
||||||
r.StartDate.DayOfYear == dateOffset.DayOfYear
|
var entity = await db.DailyReports.FirstOrDefaultAsync(r => r.IdWell == idWell && r.StartDate == startDate, token);
|
||||||
, token);
|
|
||||||
|
|
||||||
if (entity is null)
|
if (entity is null)
|
||||||
return 0;
|
throw new ArgumentInvalidException("Daily report doesn`t exist", nameof(startDate));
|
||||||
|
|
||||||
|
dto.LastUpdateDate = DateTimeOffset.Now;
|
||||||
|
if (dto is HeadDto headDto)
|
||||||
|
entity.Info.Head = headDto.Adapt<Head>();
|
||||||
|
if (dto is BhaDto bhaDto)
|
||||||
|
entity.Info.Bha = bhaDto.Adapt<Bha>();
|
||||||
|
if (dto is NoDrillingDto noDrillingDto)
|
||||||
|
entity.Info.NoDrilling = noDrillingDto.Adapt<NoDrilling>();
|
||||||
|
if (dto is SaubDto saubDto)
|
||||||
|
entity.Info.Saub = saubDto.Adapt<Saub>();
|
||||||
|
if (dto is SignDto signDto)
|
||||||
|
entity.Info.Sign = signDto.Adapt<Sign>();
|
||||||
|
|
||||||
entity.Info = Convert(dto);
|
|
||||||
db.DailyReports.Update(entity);
|
db.DailyReports.Update(entity);
|
||||||
var result = await db.SaveChangesAsync(token);
|
var result = await db.SaveChangesAsync(token);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Stream?> MakeReportAsync(int idWell, DateTime date, CancellationToken token = default)
|
public async Task<Stream?> MakeReportAsync(int idWell, DateOnly date, CancellationToken token)
|
||||||
{
|
{
|
||||||
|
var stageIds = WellOperationCategory.WorkStages.Select(w => w.Id).ToArray();
|
||||||
|
var wellOperationCategories = wellOperationRepository.GetCategories(true)
|
||||||
|
.Where(o => o.IdParent is not null)
|
||||||
|
.Where(o => stageIds.Contains(o.IdParent!.Value));
|
||||||
|
|
||||||
var dailyReportDto = await GetOrDefaultAsync(idWell, date, token);
|
var dailyReportDto = await GetOrDefaultAsync(idWell, date, token);
|
||||||
if (dailyReportDto is null)
|
if (dailyReportDto is null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var memoryStream = dailyReportMaker.MakeReportFromBlocks(dailyReportDto);
|
var memoryStream = dailyReportMaker.MakeReportFromBlocks(dailyReportDto, wellOperationCategories);
|
||||||
|
|
||||||
return memoryStream;
|
return memoryStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<DailyReportDto?> GetOrDefaultAsync(int idWell, DateTime date, CancellationToken token)
|
private async Task<DailyReportDto?> GetOrDefaultAsync(int idWell, DateOnly date, CancellationToken token)
|
||||||
{
|
{
|
||||||
var dateOffset = date.Date;
|
|
||||||
var entity = await db.DailyReports
|
var entity = await db.DailyReports
|
||||||
.FirstOrDefaultAsync(r => r.IdWell == idWell &&
|
.FirstOrDefaultAsync(r => r.IdWell == idWell && r.StartDate == date, token);
|
||||||
r.StartDate.Year == dateOffset.Year &&
|
|
||||||
r.StartDate.DayOfYear == dateOffset.DayOfYear
|
|
||||||
, token);
|
|
||||||
|
|
||||||
if (entity is null)
|
if (entity is null)
|
||||||
return null;
|
throw new ArgumentInvalidException("Daily report doesn`t exist", nameof(date));
|
||||||
var dto = Convert(entity);
|
|
||||||
|
var factOperationsForDtos = await GetFactOperationsForDailyReportAsync(idWell, token);
|
||||||
|
var userDtos = await userRepository.GetAllAsync(token);
|
||||||
|
var dto = Convert(entity, factOperationsForDtos, userDtos);
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<DailyReportDto> MakeDefaultDailyReportAsync(int idWell, DateTime date, CancellationToken token)
|
/// <summary>
|
||||||
|
/// конвертация данных из модели базы данных в dto
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entity">модель базы данных</param>
|
||||||
|
/// <param name="factOperationsForDtos">список фактичских операций для формирования суточного рапорта</param>
|
||||||
|
/// <param name="users">список пользователей для нахождения последнего изменившего запись</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private DailyReportDto Convert(
|
||||||
|
AsbCloudDb.Model.DailyReport.DailyReport entity,
|
||||||
|
IEnumerable<WellOperationDto> factOperationsForDtos,
|
||||||
|
IEnumerable<UserExtendedDto> users)
|
||||||
{
|
{
|
||||||
var well = await wellService.GetOrDefaultAsync(idWell, token);
|
|
||||||
|
|
||||||
var dto = new DailyReportDto()
|
|
||||||
{
|
|
||||||
Head = new HeadDto()
|
|
||||||
{
|
|
||||||
ReportDate = date.Date,
|
|
||||||
WellName = well?.Caption ?? "",
|
|
||||||
ClusterName = well?.Cluster ?? "",
|
|
||||||
},
|
|
||||||
Bha = await GetPrevOrNewBhaAsync(idWell, date, token)
|
|
||||||
};
|
|
||||||
return dto;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<BhaDto> GetPrevOrNewBhaAsync(int idWell, DateTime date, CancellationToken token)
|
|
||||||
{
|
|
||||||
var dateOffset = date.Date;
|
|
||||||
var entity = await db.DailyReports
|
|
||||||
.Where(x => x.IdWell == idWell)
|
|
||||||
.OrderByDescending(x => x.StartDate)
|
|
||||||
.FirstOrDefaultAsync(r => r.StartDate.Year <= dateOffset.Year &&
|
|
||||||
r.StartDate.DayOfYear <= dateOffset.DayOfYear, token);
|
|
||||||
|
|
||||||
if (entity is null)
|
|
||||||
return new BhaDto();
|
|
||||||
|
|
||||||
var dto = Convert(entity);
|
|
||||||
return dto.Bha;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DailyReportDto Convert(AsbCloudDb.Model.DailyReport.DailyReport entity)
|
|
||||||
{
|
|
||||||
var dto = entity.Info.Adapt<DailyReportDto>();
|
var dto = entity.Info.Adapt<DailyReportDto>();
|
||||||
dto.Head.ReportDate = entity.StartDate.Date;
|
dto.StartDate = entity.StartDate;
|
||||||
|
|
||||||
|
var dailyFactOperation = factOperationsForDtos
|
||||||
|
.Where(o => DateOnly.FromDateTime(o.DateStart) == dto.StartDate)
|
||||||
|
.Where(o => o.IdParentCategory is not null)
|
||||||
|
.GroupBy(o => o.IdParentCategory!.Value)
|
||||||
|
.ToDictionary(g => g.Key, g => g.Sum(o => o.DurationHours));
|
||||||
|
|
||||||
|
dto.TimeBalance.OperationsStat = dailyFactOperation;
|
||||||
|
|
||||||
|
var blocks = new ItemInfoDto[] {
|
||||||
|
dto.Head,
|
||||||
|
dto.Bha,
|
||||||
|
dto.NoDrilling,
|
||||||
|
dto.Saub,
|
||||||
|
dto.Sign
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var block in blocks)
|
||||||
|
{
|
||||||
|
if (block.IdUser is not null)
|
||||||
|
{
|
||||||
|
block.UserName = users.FirstOrDefault(u => u.Id == block.IdUser.Value)?.MakeDisplayName()
|
||||||
|
?? $"userId:{block.IdUser.Value}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DailyReportInfo Convert(DailyReportDto dto)
|
/// <summary>
|
||||||
|
/// Создание блока "Заголовок" по умолчанию
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="well"></param>
|
||||||
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="idUser"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private Head CreateHeadDailyReportBlock(WellDto well, DateOnly startDate, int idUser)
|
||||||
{
|
{
|
||||||
var entity = dto.Adapt<DailyReportInfo>();
|
var customer = well.Companies.FirstOrDefault(company => company.IdCompanyType == 1);
|
||||||
entity.Head.ReportDate = dto.Head.ReportDate.Date.Date;
|
var contractor = well.Companies.FirstOrDefault(company => company.IdCompanyType == 2);
|
||||||
return entity;
|
|
||||||
}
|
return new Head()
|
||||||
|
{
|
||||||
|
ReportDate = startDate,
|
||||||
|
WellName = well.Caption,
|
||||||
|
ClusterName = well?.Cluster ?? string.Empty,
|
||||||
|
Customer = customer?.Caption ?? string.Empty,
|
||||||
|
Contractor = contractor?.Caption ?? string.Empty,
|
||||||
|
IdUser = idUser,
|
||||||
|
LastUpdateDate = DateTimeOffset.Now,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#nullable disable
|
#nullable disable
|
||||||
}
|
}
|
||||||
|
@ -86,16 +86,14 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: It shouldn`t be nullable. Throw exceptions instead and return empty.
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public virtual async Task<IEnumerable<TDto>?> GetOrDefaultAsync(int idWell,
|
public virtual async Task<IEnumerable<TDto>> GetAsync(int idWell,
|
||||||
DateTime dateBegin = default, double intervalSec = 600d,
|
DateTime dateBegin = default, double intervalSec = 600d,
|
||||||
int approxPointsCount = 1024, CancellationToken token = default)
|
int approxPointsCount = 1024, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
||||||
if (telemetry is null)
|
if (telemetry is null)
|
||||||
return null;
|
return Enumerable.Empty<TDto>();
|
||||||
|
|
||||||
var timezone = telemetryService.GetTimezone(telemetry.Id);
|
var timezone = telemetryService.GetTimezone(telemetry.Id);
|
||||||
|
|
||||||
@ -134,7 +132,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
|||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
if (fullDataCount == 0)
|
if (fullDataCount == 0)
|
||||||
return default;
|
return Enumerable.Empty<TDto>();
|
||||||
|
|
||||||
if (fullDataCount > 1.75 * approxPointsCount)
|
if (fullDataCount > 1.75 * approxPointsCount)
|
||||||
{
|
{
|
||||||
|
@ -121,8 +121,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
|||||||
_ => 32_768
|
_ => 32_768
|
||||||
};
|
};
|
||||||
|
|
||||||
var data = await GetOrDefaultAsync(idWell, beginDate, intervalSec, approxPointsCount, token )
|
var data = await GetAsync(idWell, beginDate, intervalSec, approxPointsCount, token );
|
||||||
?? Enumerable.Empty<TelemetryDataSaubDto>();
|
|
||||||
|
|
||||||
var fileName = $"DataSaub idWell{idWell}";
|
var fileName = $"DataSaub idWell{idWell}";
|
||||||
if (telemetry.Info is not null)
|
if (telemetry.Info is not null)
|
||||||
|
@ -0,0 +1,108 @@
|
|||||||
|
using AsbCloudApp.ValidationAttributes;
|
||||||
|
using System;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.Tests.AttributeTest
|
||||||
|
{
|
||||||
|
public class DateValidationAttributeTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void AllowNull_true_on_null_valid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { AllowNull = true };
|
||||||
|
var result = attribute.IsValid(null);
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AllowNull_false_on_null_invalid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { AllowNull = false };
|
||||||
|
var result = attribute.IsValid(null);
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsDateOnly_true_on_empty_timePart_valid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { IsDateOnly = true };
|
||||||
|
var date = new DateTime(2023, 01, 01, 00, 00, 00);
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsDateOnly_true_on_timePart_invalid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { IsDateOnly = true };
|
||||||
|
var date = new DateTime(2023, 01, 01, 01, 01, 01);
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsDateOnly_true_on_utc_invalid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { IsDateOnly = true };
|
||||||
|
var date = new DateTime(2023, 01, 01, 00, 00, 00, DateTimeKind.Utc);
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AllowUtc_true_on_unspecified_valid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { AllowUtc = true };
|
||||||
|
var date = new DateTime(2023, 01, 01, 00, 00, 00, DateTimeKind.Unspecified);
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AllowUtc_true_on_utc_valid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { AllowUtc = true };
|
||||||
|
var date = new DateTime(2023, 01, 01, 00, 00, 00, DateTimeKind.Utc);
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AllowUtc_false_on_utc_invalid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { AllowUtc = false };
|
||||||
|
var date = new DateTime(2023, 01, 01, 00, 00, 00, DateTimeKind.Utc);
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AllowUtc_false_on_unspecified_valid()
|
||||||
|
{
|
||||||
|
var attribute = new DateValidationAttribute { AllowUtc = false };
|
||||||
|
var date = new DateTime(2023, 01, 01, 00, 00, 00, DateTimeKind.Unspecified);
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GtDate_on_same_date_invalid()
|
||||||
|
{
|
||||||
|
var gtDate = "2023-01-01T00:00:00";
|
||||||
|
var date = DateTime.Parse(gtDate);
|
||||||
|
var attribute = new DateValidationAttribute { GtDate = gtDate };
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GtDate_on_greater_date_valid()
|
||||||
|
{
|
||||||
|
var gtDate = "2023-01-01T00:00:00";
|
||||||
|
var date = DateTime.Parse(gtDate).AddMilliseconds(1);
|
||||||
|
var attribute = new DateValidationAttribute { GtDate = gtDate };
|
||||||
|
var result = attribute.IsValid(date);
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,7 @@ namespace AsbCloudWebApi.Tests.Middlware
|
|||||||
|
|
||||||
public class TelemetryDataSaubService : ITelemetryDataSaubService
|
public class TelemetryDataSaubService : ITelemetryDataSaubService
|
||||||
{
|
{
|
||||||
public async Task<IEnumerable<TelemetryDataSaubDto>?> GetOrDefaultAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default)
|
public async Task<IEnumerable<TelemetryDataSaubDto>?> GetAsync(int idWell, DateTime dateBegin = default, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
await Task.Delay(1000, token);
|
await Task.Delay(1000, token);
|
||||||
return Enumerable.Empty<TelemetryDataSaubDto>();
|
return Enumerable.Empty<TelemetryDataSaubDto>();
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
using AsbCloudApp.Data.DailyReport;
|
using AsbCloudApp.Data.DailyReport;
|
||||||
|
using AsbCloudApp.Exceptions;
|
||||||
|
using AsbCloudApp.Repositories;
|
||||||
using AsbCloudApp.Services;
|
using AsbCloudApp.Services;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@ -10,6 +12,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace AsbCloudWebApi.Controllers
|
namespace AsbCloudWebApi.Controllers
|
||||||
{
|
{
|
||||||
|
#nullable enable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Суточный рапорт
|
/// Суточный рапорт
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -20,11 +23,16 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
{
|
{
|
||||||
private readonly IDailyReportService dailyReportService;
|
private readonly IDailyReportService dailyReportService;
|
||||||
private readonly IWellService wellService;
|
private readonly IWellService wellService;
|
||||||
|
private readonly IWellOperationRepository operationRepository;
|
||||||
|
|
||||||
public DailyReportController(IDailyReportService dailyReportService, IWellService wellService)
|
public DailyReportController(
|
||||||
|
IDailyReportService dailyReportService,
|
||||||
|
IWellService wellService,
|
||||||
|
IWellOperationRepository operationRepository)
|
||||||
{
|
{
|
||||||
this.dailyReportService = dailyReportService;
|
this.dailyReportService = dailyReportService;
|
||||||
this.wellService = wellService;
|
this.wellService = wellService;
|
||||||
|
this.operationRepository = operationRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -36,60 +44,115 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
//[Permission]
|
|
||||||
[ProducesResponseType(typeof(IEnumerable<DailyReportDto>), (int)System.Net.HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(IEnumerable<DailyReportDto>), (int)System.Net.HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> GetListAsync(int idWell, DateTime? begin = null, DateTime? end = null, CancellationToken token = default)
|
public async Task<IActionResult> GetListAsync(int idWell, DateOnly? begin, DateOnly? end, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await dailyReportService.GetListAsync(idWell, begin, end, token);
|
var result = await dailyReportService.GetListAsync(idWell, begin, end, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить из БД или генерировать набор данных для формирования рапорта на новую дату.
|
/// Создание суточного рапорта
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="date"></param>
|
/// <param name="startDate"></param>
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("{date}")]
|
|
||||||
//[Permission]
|
|
||||||
[ProducesResponseType(typeof(DailyReportDto), (int)System.Net.HttpStatusCode.OK)]
|
|
||||||
public async Task<IActionResult> GetOrGenerateAsync(int idWell, [Required] DateTime date, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
var dto = await dailyReportService.GetOrGenerateAsync(idWell, date, token);
|
|
||||||
return Ok(dto);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Сохранение нового набора данных для формирования рапорта
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idWell"></param>
|
|
||||||
/// <param name="dto"></param>
|
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
//[Permission]
|
|
||||||
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> AddAsync(int idWell, [Required][FromBody] DailyReportDto dto, CancellationToken token = default)
|
public async Task<IActionResult> AddAsync(int idWell, [Required] DateOnly startDate, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await dailyReportService.AddAsync(idWell, dto, token);
|
if (!await UserHasAccesToWellAsync(idWell, token))
|
||||||
|
return Forbid();
|
||||||
|
|
||||||
|
var idUser = User.GetUserId()!.Value;
|
||||||
|
|
||||||
|
var result = await dailyReportService.AddAsync(idWell, startDate, idUser, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Сохранение изменений набора данных для формирования рапорта
|
/// Сохранение изменений набора данных для формирования рапорта (заголовок)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="date"></param>
|
/// <param name="date">Дата без учета времени</param>
|
||||||
/// <param name="dto"></param>
|
/// <param name="dto"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPut("{date}")]
|
[HttpPut("{date}/head")]
|
||||||
//[Permission]
|
|
||||||
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> UpdateAsync(int idWell, [Required] DateTime date, [Required] DailyReportDto dto, CancellationToken token = default)
|
public Task<IActionResult> UpdateHeadAsync(int idWell, [Required] DateOnly date, [Required] HeadDto dto, CancellationToken token)
|
||||||
|
=> UpdateReportBlockAsync(idWell, date, dto, token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение изменений набора данных для формирования рапорта (блок КНБК)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="date">Дата без учета времени</param>
|
||||||
|
/// <param name="dto"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPut("{date}/bha")]
|
||||||
|
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||||
|
public Task<IActionResult> UpdateBhaAsync(int idWell, [Required] DateOnly date, [Required] BhaDto dto, CancellationToken token)
|
||||||
|
=> UpdateReportBlockAsync(idWell, date, dto, token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение изменений набора данных для формирования рапорта (безметражные работы)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="date">Дата без учета времени</param>
|
||||||
|
/// <param name="dto"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPut("{date}/noDrilling")]
|
||||||
|
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||||
|
public Task<IActionResult> UpdateNoDrillingAsync(int idWell, [Required] DateOnly date, [Required] NoDrillingDto dto, CancellationToken token)
|
||||||
|
=> UpdateReportBlockAsync(idWell, date, dto, token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение изменений набора данных для формирования рапорта (САУБ)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="date">Дата без учета времени</param>
|
||||||
|
/// <param name="dto"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPut("{date}/saub")]
|
||||||
|
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||||
|
public Task<IActionResult> UpdateSaubAsync(int idWell, [Required] DateOnly date, [Required] SaubDto dto, CancellationToken token)
|
||||||
|
=> UpdateReportBlockAsync(idWell, date, dto, token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение изменений набора данных для формирования рапорта (подпись)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="date">Дата без учета времени</param>
|
||||||
|
/// <param name="dto"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPut("{date}/sign")]
|
||||||
|
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||||
|
public Task<IActionResult> UpdateSignAsync(int idWell, [Required] DateOnly date, [Required] SignDto dto, CancellationToken token)
|
||||||
|
=> UpdateReportBlockAsync(idWell, date, dto, token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновление блока суточного рапорта
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell">ключ скважины</param>
|
||||||
|
/// <param name="date">дата суточного рапорта</param>
|
||||||
|
/// <param name="dto"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task<IActionResult> UpdateReportBlockAsync(int idWell, DateOnly date, ItemInfoDto dto, CancellationToken token)
|
||||||
{
|
{
|
||||||
var result = await dailyReportService.UpdateAsync(idWell, date, dto, token);
|
if (!await UserHasAccesToWellAsync(idWell, token))
|
||||||
|
return Forbid();
|
||||||
|
|
||||||
|
dto.IdUser = User.GetUserId();
|
||||||
|
dto.LastUpdateDate = DateTimeOffset.Now;
|
||||||
|
|
||||||
|
var result = await dailyReportService.UpdateBlockAsync(idWell, date, dto, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,19 +164,34 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{date}/excel")]
|
[HttpGet("{date}/excel")]
|
||||||
//[Permission]
|
|
||||||
[ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> DownloadAsync(int idWell, DateTime date, CancellationToken token = default)
|
public async Task<IActionResult> DownloadAsync(int idWell, DateOnly date, CancellationToken token)
|
||||||
{
|
{
|
||||||
var well = await wellService.GetOrDefaultAsync(idWell, token);
|
if (!await UserHasAccesToWellAsync(idWell, token))
|
||||||
|
return Forbid();
|
||||||
|
|
||||||
|
var well = await wellService.GetOrDefaultAsync(idWell, token)
|
||||||
|
?? throw new ArgumentInvalidException($"Скважина c id:{idWell} не найдена", nameof(idWell));
|
||||||
|
|
||||||
var stream = await dailyReportService.MakeReportAsync(idWell, date, token);
|
var stream = await dailyReportService.MakeReportAsync(idWell, date, token);
|
||||||
if (stream != null)
|
if (stream is not null)
|
||||||
{
|
{
|
||||||
var fileName = $"Суточный рапорт по скважине {well.Caption} куст {well.Cluster}.xlsx";
|
var fileName = $"Суточный рапорт по скважине {well.Caption} куст {well.Cluster}.xlsx";
|
||||||
return File(stream, "application/octet-stream", fileName);
|
return File(stream, "application/octet-stream", fileName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async Task<bool> UserHasAccesToWellAsync(int idWell, CancellationToken token)
|
||||||
|
{
|
||||||
|
var idCompany = User.GetCompanyId();
|
||||||
|
if (idCompany is not null &&
|
||||||
|
await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token)
|
||||||
|
.ConfigureAwait(false))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#nullable disable
|
||||||
}
|
}
|
||||||
|
@ -77,22 +77,17 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("cluster/{idCluster}/stat")] // TODO: Это статистика кластера, перенести в ClusterOperationStatController
|
[Route("cluster/{idCluster}/stat")]
|
||||||
[Permission]
|
[Permission]
|
||||||
[ProducesResponseType(typeof(StatClusterDto), (int)System.Net.HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(StatClusterDto), (int)System.Net.HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> GetStatClusterAsync(int idCluster,
|
public async Task<IActionResult> GetStatClusterAsync(int idCluster,
|
||||||
CancellationToken token = default)
|
CancellationToken token = default)
|
||||||
{
|
{
|
||||||
int? idCompanyOrNull = User.GetCompanyId();
|
int? idCompany = User.GetCompanyId();
|
||||||
if (idCompanyOrNull is null)
|
if (idCompany is null)
|
||||||
return Forbid();
|
return Forbid();
|
||||||
|
|
||||||
int idCompany = idCompanyOrNull ?? 0;
|
var result = await operationsStatService.GetStatClusterAsync(idCluster, idCompany.Value, token)
|
||||||
// TODO: Fix next commented lines
|
|
||||||
//if (!await CanUserAccessToWellAsync(idCluster, token).ConfigureAwait(false))
|
|
||||||
// return Forbid();
|
|
||||||
|
|
||||||
var result = await operationsStatService.GetStatClusterAsync(idCluster, idCompany, token)
|
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ namespace AsbCloudWebApi.Controllers.SAUB
|
|||||||
if (!isCompanyOwnsWell)
|
if (!isCompanyOwnsWell)
|
||||||
return Forbid();
|
return Forbid();
|
||||||
|
|
||||||
var content = await telemetryDataService.GetOrDefaultAsync(idWell, begin,
|
var content = await telemetryDataService.GetAsync(idWell, begin,
|
||||||
intervalSec, approxPointsCount, token).ConfigureAwait(false);
|
intervalSec, approxPointsCount, token).ConfigureAwait(false);
|
||||||
|
|
||||||
return Ok(content);
|
return Ok(content);
|
||||||
|
@ -8,6 +8,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace AsbCloudWebApi.Controllers
|
namespace AsbCloudWebApi.Controllers
|
||||||
{
|
{
|
||||||
|
#nullable enable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Расписание бурильщиков
|
/// Расписание бурильщиков
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -32,12 +33,12 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns>бурильщик</returns>
|
/// <returns>бурильщик</returns>
|
||||||
[HttpGet("driller")]
|
[HttpGet("driller")]
|
||||||
public async Task<ActionResult<DrillerDto>> GetDrillerAsync(int idWell, DateTime workTime, CancellationToken token)
|
public async Task<ActionResult<DrillerDto?>> GetDrillerAsync(int idWell, DateTime workTime, CancellationToken token)
|
||||||
{
|
{
|
||||||
if (!await UserHasAccesToWellAsync(idWell, token))
|
if (!await UserHasAccesToWellAsync(idWell, token))
|
||||||
return Forbid();
|
return Forbid();
|
||||||
|
|
||||||
var result = await scheduleService.GetDrillerAsync(idWell, workTime, token);
|
var result = await scheduleService.GetOrDefaultDrillerAsync(idWell, workTime, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
22
AsbCloudWebApi/Converters/DateOnlyJsonConverter.cs
Normal file
22
AsbCloudWebApi/Converters/DateOnlyJsonConverter.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.Converters
|
||||||
|
{
|
||||||
|
#nullable enable
|
||||||
|
public class DateOnlyJsonConverter : JsonConverter<DateOnly>
|
||||||
|
{
|
||||||
|
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
return DateOnly.FromDateTime(reader.GetDateTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
|
||||||
|
{
|
||||||
|
var isoDate = value.ToString("O");
|
||||||
|
writer.WriteStringValue(isoDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#nullable disable
|
||||||
|
}
|
48
AsbCloudWebApi/Converters/DateOnlyTypeConverter.cs
Normal file
48
AsbCloudWebApi/Converters/DateOnlyTypeConverter.cs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.Converters
|
||||||
|
{
|
||||||
|
#nullable enable
|
||||||
|
public class DateOnlyTypeConverter : TypeConverter
|
||||||
|
{
|
||||||
|
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
|
||||||
|
{
|
||||||
|
if (sourceType == typeof(string))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return base.CanConvertFrom(context, sourceType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
|
||||||
|
{
|
||||||
|
if (value is string str)
|
||||||
|
{
|
||||||
|
return DateOnly.Parse(str);
|
||||||
|
}
|
||||||
|
return base.ConvertFrom(context, culture, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CanConvertTo(ITypeDescriptorContext? context, Type? destinationType)
|
||||||
|
{
|
||||||
|
if (destinationType == typeof(string))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return base.CanConvertTo(context, destinationType);
|
||||||
|
}
|
||||||
|
public override object? ConvertTo(ITypeDescriptorContext? context, CultureInfo? culture, object? value, Type destinationType)
|
||||||
|
{
|
||||||
|
if (destinationType == typeof(string) && value is DateOnly date)
|
||||||
|
{
|
||||||
|
return date.ToString("O");
|
||||||
|
}
|
||||||
|
return base.ConvertTo(context, culture, value, destinationType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#nullable disable
|
||||||
|
}
|
@ -5,7 +5,7 @@ using System.Globalization;
|
|||||||
namespace AsbCloudWebApi.Converters
|
namespace AsbCloudWebApi.Converters
|
||||||
{
|
{
|
||||||
#nullable enable
|
#nullable enable
|
||||||
public class DateOnlyTypeConverter : TypeConverter
|
public class TimeOnlyTypeConverter : TypeConverter
|
||||||
{
|
{
|
||||||
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
|
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
|
||||||
{
|
{
|
||||||
|
@ -3,11 +3,9 @@ using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Microsoft.OpenApi.Models;
|
using Microsoft.OpenApi.Models;
|
||||||
using Swashbuckle.AspNetCore.SwaggerGen;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -19,6 +17,7 @@ namespace AsbCloudWebApi
|
|||||||
{
|
{
|
||||||
services.AddSwaggerGen(c =>
|
services.AddSwaggerGen(c =>
|
||||||
{
|
{
|
||||||
|
c.MapType<DateOnly>(() => new OpenApiSchema { Type = "string", Format = "date" });
|
||||||
c.CustomOperationIds(e =>
|
c.CustomOperationIds(e =>
|
||||||
{
|
{
|
||||||
return $"{e.ActionDescriptor.RouteValues["action"]}";
|
return $"{e.ActionDescriptor.RouteValues["action"]}";
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
using AsbCloudApp.Data;
|
using AsbCloudApp.Data;
|
||||||
using System.Collections.Generic;
|
using AsbCloudWebApi.Converters;
|
||||||
using System.Linq;
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc
|
namespace Microsoft.AspNetCore.Mvc
|
||||||
{
|
{
|
||||||
public static class Extentions
|
public static class Extentions
|
||||||
{
|
{
|
||||||
@ -38,48 +39,12 @@ namespace Microsoft.AspNetCore.Mvc
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BadRequestBuilder BadRequestBuilder(this ControllerBase controller, string paramName, params string[] errors)
|
public static MvcOptions UseDateOnlyTimeOnlyStringConverters(this MvcOptions options)
|
||||||
=> new BadRequestBuilder(paramName, errors);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class BadRequestBuilder
|
|
||||||
{
|
|
||||||
private readonly Dictionary<string, List<string>> body;
|
|
||||||
|
|
||||||
private List<string> GetOrCreateNew(string paramName)
|
|
||||||
{
|
{
|
||||||
List<string> par;
|
TypeDescriptor.AddAttributes(typeof(DateOnly), new TypeConverterAttribute(typeof(DateOnlyTypeConverter)));
|
||||||
if (body.ContainsKey(paramName))
|
return options;
|
||||||
par = body[paramName];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
par = new List<string>();
|
|
||||||
body[paramName] = par;
|
|
||||||
}
|
|
||||||
return par;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BadRequestBuilder(string paramName, params string[] errors)
|
|
||||||
{
|
|
||||||
body = new();
|
|
||||||
body[paramName] = new List<string>(errors);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BadRequestBuilder Add(string paramName, params string[] errors)
|
|
||||||
{
|
|
||||||
var par = GetOrCreateNew(paramName);
|
|
||||||
par.AddRange(errors);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BadRequestObjectResult Build()
|
|
||||||
{
|
|
||||||
var o = body.Select(e => new { name = e.Key, errors = e.Value.ToArray() });
|
|
||||||
|
|
||||||
return new BadRequestObjectResult(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static implicit operator BadRequestObjectResult(BadRequestBuilder d) => d.Build();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using AsbCloudInfrastructure;
|
using AsbCloudInfrastructure;
|
||||||
|
using AsbCloudWebApi.Converters;
|
||||||
using AsbCloudWebApi.Middlewares;
|
using AsbCloudWebApi.Middlewares;
|
||||||
using AsbCloudWebApi.SignalR;
|
using AsbCloudWebApi.SignalR;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
@ -6,6 +7,7 @@ using Microsoft.AspNetCore.Hosting;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace AsbCloudWebApi
|
namespace AsbCloudWebApi
|
||||||
{
|
{
|
||||||
@ -25,9 +27,13 @@ namespace AsbCloudWebApi
|
|||||||
options.JsonSerializerOptions.NumberHandling =
|
options.JsonSerializerOptions.NumberHandling =
|
||||||
System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals |
|
System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals |
|
||||||
System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString;
|
System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString;
|
||||||
|
|
||||||
|
options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
|
||||||
}))
|
}))
|
||||||
.AddProtoBufNet();
|
.AddProtoBufNet();
|
||||||
|
|
||||||
|
services.AddControllers(options => options.UseDateOnlyTimeOnlyStringConverters());
|
||||||
|
|
||||||
ProtobufModel.EnshureRegistered();
|
ProtobufModel.EnshureRegistered();
|
||||||
|
|
||||||
services.AddSwagger();
|
services.AddSwagger();
|
||||||
@ -87,6 +93,7 @@ namespace AsbCloudWebApi
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||||
|
Loading…
Reference in New Issue
Block a user