forked from ddrilling/AsbCloudServer
merge and fix
This commit is contained in:
commit
24b40973bb
@ -4,213 +4,213 @@ using System.Collections.Generic;
|
||||
namespace AsbCloudApp.Data
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// Параметры для формирования суточного рапорта
|
||||
/// </summary>
|
||||
public class DailyReportDto
|
||||
{
|
||||
/// <summary>
|
||||
///название скважины
|
||||
/// <summary>
|
||||
/// название скважины
|
||||
/// </summary>
|
||||
public string WellName { get; set; }
|
||||
|
||||
///<summary>
|
||||
///название куста
|
||||
///<summary>
|
||||
/// <summary>
|
||||
/// название куста
|
||||
/// </summary>
|
||||
public string ClusterName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///заказчик
|
||||
///<summary>
|
||||
/// заказчик
|
||||
/// </summary>
|
||||
public string Customer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///подрядчик
|
||||
///<summary>
|
||||
/// подрядчик
|
||||
/// </summary>
|
||||
public string Contractor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///дата рапорта
|
||||
///<summary>
|
||||
/// дата рапорта
|
||||
/// </summary>
|
||||
public DateTime ReportDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///глубина забоя на дату начала интервала
|
||||
///<summary>
|
||||
/// глубина забоя на дату начала интервала
|
||||
/// </summary>
|
||||
public double? WellDepthIntervalStartDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///глубина забоя на дату окончания интервала
|
||||
///<summary>
|
||||
/// глубина забоя на дату окончания интервала
|
||||
/// </summary>
|
||||
public double? WellDepthIntervalFinishDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Глубина забоя по стволу на окончание отчетного периода
|
||||
///<summary>
|
||||
/// Глубина забоя по стволу на окончание отчетного периода
|
||||
/// </summary>
|
||||
public double? BottomholeDepth { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Глубина забоя по вертикали на дату окончания отчетного периода
|
||||
///<summary>
|
||||
/// Глубина забоя по вертикали на дату окончания отчетного периода
|
||||
/// </summary>
|
||||
public double? VerticalDepth { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Зeнитный угол на дату окончания отчетного периода
|
||||
///<summary>
|
||||
/// Зенитный угол на дату окончания отчетного периода
|
||||
/// </summary>
|
||||
public double? ZenithAngle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Азимутальный угол на дату окончания отчетного периода
|
||||
///<summary>
|
||||
/// Азимутальный угол на дату окончания отчетного периода
|
||||
/// </summary>
|
||||
public double? AzimuthAngle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО бурильщиков
|
||||
///<summary>
|
||||
/// ФИО бурильщиков
|
||||
/// </summary>
|
||||
public string FirstDriller { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО бурильщиков
|
||||
///<summary>
|
||||
/// ФИО бурильщиков
|
||||
/// </summary>
|
||||
public string SecondDriller { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Время работы АПД
|
||||
///<summary>
|
||||
/// Время работы АПД
|
||||
/// </summary>
|
||||
public double? WorkTimeSAUB { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Время работы спин мастер
|
||||
///<summary>
|
||||
/// Время работы спин мастер
|
||||
/// </summary>
|
||||
public double? WorkTimeSpinMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Время работы торк мастер
|
||||
///<summary>
|
||||
/// Время работы torqueMaster
|
||||
/// </summary>
|
||||
public double? WorkTimeTorkMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных с включенным АПД
|
||||
///<summary>
|
||||
/// количество метров пробуренных с включенным АПД
|
||||
/// </summary>
|
||||
public double? PenetrationSAUB { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных с включенным Спин мастер
|
||||
///<summary>
|
||||
/// количество метров пробуренных с включенным Спин мастер
|
||||
/// </summary>
|
||||
public double? PenetrationSpinMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных с включенным торк мастер
|
||||
///<summary>
|
||||
/// количество метров пробуренных с включенным torqueMaster
|
||||
/// </summary>
|
||||
public double? PenetrationTorkMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество запусков МСЕ
|
||||
///<summary>
|
||||
/// Количество запусков МСЕ
|
||||
/// </summary>
|
||||
public int CountLaunchesMSE { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///КНБК описание
|
||||
///<summary>
|
||||
/// КНБК описание
|
||||
/// </summary>
|
||||
public string BHADescription { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
||||
///<summary>
|
||||
/// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
||||
/// </summary>
|
||||
public double? StandardTimeBarrelPreparation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Нормативное время на одну операцию по наращиванию
|
||||
///<summary>
|
||||
/// Нормативное время на одну операцию по наращиванию
|
||||
/// </summary>
|
||||
public double? StandardTimeExtension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Фактическое время проработок при подготовке ствола скважины к наращиванию.
|
||||
///<summary>
|
||||
/// Фактическое время проработок при подготовке ствола скважины к наращиванию.
|
||||
/// </summary>
|
||||
public double? ActualTimeBarrelPreparation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Фактическое время наращиваний
|
||||
///<summary>
|
||||
/// Фактическое время наращиваний
|
||||
/// </summary>
|
||||
public double? ActualTimeExtension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Режимы бурения в роторе
|
||||
///<summary>
|
||||
/// Режимы бурения в роторе
|
||||
/// </summary>
|
||||
public IEnumerable<string> RotorDrillingModes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///режимы бурения в слайде
|
||||
///<summary>
|
||||
/// режимы бурения в слайде
|
||||
/// </summary>
|
||||
public IEnumerable<string> SlideDrillingModes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество метров пробуренных в роторе за отчетный период
|
||||
///<summary>
|
||||
/// Количество метров пробуренных в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? PenetrationInRotor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество часов бурения в роторе за отчетный период
|
||||
///<summary>
|
||||
/// Количество часов бурения в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? NumberDrillingHours { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///средний диф перепад в роторе за отчетный период
|
||||
///<summary>
|
||||
/// средний диф перепад в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? AVGDiffDropRotor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных в слайде за отчетный период
|
||||
///<summary>
|
||||
/// количество метров пробуренных в слайде за отчетный период
|
||||
/// </summary>
|
||||
public double? PenetrationInSlide { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///время бурения в роторе за отчетный период
|
||||
///<summary>
|
||||
/// время бурения в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? DrillingTimeInRotor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///средний диф перепад в слайде за отчетный период
|
||||
///<summary>
|
||||
/// средний диф. перепад в слайде за отчетный период
|
||||
/// </summary>
|
||||
public double? AVGDiffPressureSlide { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Плановая МСП за секцию
|
||||
///<summary>
|
||||
/// Плановая МСП за секцию
|
||||
/// </summary>
|
||||
public double? SectionROPPlan { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Общее время бурения за секцию
|
||||
///<summary>
|
||||
/// Общее время бурения за секцию
|
||||
/// </summary>
|
||||
public double? SectionDrillingTimeTotal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Общая проходка за секцию
|
||||
///<summary>
|
||||
/// Общая проходка за секцию
|
||||
/// </summary>
|
||||
public double? SectionPenetrationTotal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество наращиваний за отчетный период
|
||||
///<summary>
|
||||
/// Количество наращиваний за отчетный период
|
||||
/// </summary>
|
||||
public int ExtensionsCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Отклонение относительно ГГД
|
||||
///<summary>
|
||||
/// Отклонение относительно ГГД
|
||||
/// </summary>
|
||||
public double? DeviationFromTVD { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///указываются все причины, которые влияют на снижение МСП.
|
||||
///<summary>
|
||||
/// указываются все причины, которые влияют на снижение МСП.
|
||||
/// </summary>
|
||||
public string DeclinesReasonsROP { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО Мастера буровой
|
||||
///<summary>
|
||||
/// ФИО Мастера буровой
|
||||
/// </summary>
|
||||
public string DrillingMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО супервайзера
|
||||
///<summary>
|
||||
/// ФИО супервайзера
|
||||
/// </summary>
|
||||
public string Supervisor { get; set; }
|
||||
}
|
||||
}
|
||||
|
18
AsbCloudApp/Services/IDailyReportService.cs
Normal file
18
AsbCloudApp/Services/IDailyReportService.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using AsbCloudApp.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AsbCloudApp.Services
|
||||
{
|
||||
public interface IDailyReportService
|
||||
{
|
||||
Task<IEnumerable<DailyReportDto>> GetListAsync(int idWell, DateTime? v1, DateTime? v2, CancellationToken cancellationToken);
|
||||
Task<DailyReportDto> GetOrGenerateAsync(int idWell, DateTime date, CancellationToken token);
|
||||
Task<int> AddAsync(int idWell, DailyReportDto dto, CancellationToken token = default);
|
||||
Task<int> UpdateAsync(int idWell, DateTime date, DailyReportDto dto, CancellationToken token = default);
|
||||
Task<Stream> MakeReportAsync(int idWell, DateTime date, CancellationToken token = default);
|
||||
}
|
||||
}
|
@ -43,7 +43,7 @@ namespace AsbCloudDb.Model
|
||||
public virtual DbSet<RelationUserRolePermission> RelationUserRolePermissions { get; set; }
|
||||
public virtual DbSet<RelationUserRoleUserRole> RelationUserRoleUserRoles { get; set; }
|
||||
public virtual DbSet<RelationUserDrillingProgramPart> RelationDrillingProgramPartUsers { get; set; }
|
||||
public virtual DbSet<DailyReport> DailyReport { get; set; }
|
||||
public virtual DbSet<DailyReport> DailyReports { get; set; }
|
||||
|
||||
// WITS
|
||||
public DbSet<WITS.Record1> Record1 { get; set; }
|
||||
|
@ -1,216 +1,213 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AsbCloudDb.Model
|
||||
{
|
||||
public class DailyReportInfo
|
||||
{
|
||||
/// <summary>
|
||||
///название скважины
|
||||
/// <summary>
|
||||
/// название скважины
|
||||
/// </summary>
|
||||
public string WellName { get; set; }
|
||||
|
||||
///<summary>
|
||||
///название куста
|
||||
///<summary>
|
||||
/// <summary>
|
||||
/// название куста
|
||||
/// </summary>
|
||||
public string ClusterName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///заказчик
|
||||
///<summary>
|
||||
/// заказчик
|
||||
/// </summary>
|
||||
public string Customer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///подрядчик
|
||||
///<summary>
|
||||
/// подрядчик
|
||||
/// </summary>
|
||||
public string Contractor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///дата рапорта
|
||||
///<summary>
|
||||
public DateTime ReportDate { get; set; }
|
||||
/// дата рапорта
|
||||
/// </summary>
|
||||
public DateTimeOffset ReportDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///глубина забоя на дату начала интервала
|
||||
///<summary>
|
||||
/// глубина забоя на дату начала интервала
|
||||
/// </summary>
|
||||
public double? WellDepthIntervalStartDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///глубина забоя на дату окончания интервала
|
||||
///<summary>
|
||||
/// глубина забоя на дату окончания интервала
|
||||
/// </summary>
|
||||
public double? WellDepthIntervalFinishDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Глубина забоя по стволу на окончание отчетного периода
|
||||
///<summary>
|
||||
/// Глубина забоя по стволу на окончание отчетного периода
|
||||
/// </summary>
|
||||
public double? BottomholeDepth { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Глубина забоя по вертикали на дату окончания отчетного периода
|
||||
///<summary>
|
||||
/// Глубина забоя по вертикали на дату окончания отчетного периода
|
||||
/// </summary>
|
||||
public double? VerticalDepth { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Зeнитный угол на дату окончания отчетного периода
|
||||
///<summary>
|
||||
/// Зенитный угол на дату окончания отчетного периода
|
||||
/// </summary>
|
||||
public double? ZenithAngle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Азимутальный угол на дату окончания отчетного периода
|
||||
///<summary>
|
||||
/// Азимутальный угол на дату окончания отчетного периода
|
||||
/// </summary>
|
||||
public double? AzimuthAngle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО бурильщиков
|
||||
///<summary>
|
||||
/// ФИО бурильщиков
|
||||
/// </summary>
|
||||
public string FirstDriller { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО бурильщиков
|
||||
///<summary>
|
||||
/// ФИО бурильщиков
|
||||
/// </summary>
|
||||
public string SecondDriller { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Время работы АПД
|
||||
///<summary>
|
||||
/// Время работы АПД
|
||||
/// </summary>
|
||||
public double? WorkTimeSAUB { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Время работы спин мастер
|
||||
///<summary>
|
||||
/// Время работы спин мастер
|
||||
/// </summary>
|
||||
public double? WorkTimeSpinMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Время работы торк мастер
|
||||
///<summary>
|
||||
/// Время работы torqueMaster
|
||||
/// </summary>
|
||||
public double? WorkTimeTorkMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных с включенным АПД
|
||||
///<summary>
|
||||
/// количество метров пробуренных с включенным АПД
|
||||
/// </summary>
|
||||
public double? PenetrationSAUB { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных с включенным Спин мастер
|
||||
///<summary>
|
||||
/// количество метров пробуренных с включенным Спин мастер
|
||||
/// </summary>
|
||||
public double? PenetrationSpinMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных с включенным торк мастер
|
||||
///<summary>
|
||||
/// количество метров пробуренных с включенным torqueMaster
|
||||
/// </summary>
|
||||
public double? PenetrationTorkMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество запусков МСЕ
|
||||
///<summary>
|
||||
/// Количество запусков МСЕ
|
||||
/// </summary>
|
||||
public int CountLaunchesMSE { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///КНБК описание
|
||||
///<summary>
|
||||
/// КНБК описание
|
||||
/// </summary>
|
||||
public string BHADescription { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
||||
///<summary>
|
||||
/// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
|
||||
/// </summary>
|
||||
public double? StandardTimeBarrelPreparation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Нормативное время на одну операцию по наращиванию
|
||||
///<summary>
|
||||
/// Нормативное время на одну операцию по наращиванию
|
||||
/// </summary>
|
||||
public double? StandardTimeExtension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Фактическое время проработок при подготовке ствола скважины к наращиванию.
|
||||
///<summary>
|
||||
/// Фактическое время проработок при подготовке ствола скважины к наращиванию.
|
||||
/// </summary>
|
||||
public double? ActualTimeBarrelPreparation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Фактическое время наращиваний
|
||||
///<summary>
|
||||
/// Фактическое время наращиваний
|
||||
/// </summary>
|
||||
public double? ActualTimeExtension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Режимы бурения в роторе
|
||||
///<summary>
|
||||
/// Режимы бурения в роторе
|
||||
/// </summary>
|
||||
public IEnumerable<string> RotorDrillingModes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///режимы бурения в слайде
|
||||
///<summary>
|
||||
/// режимы бурения в слайде
|
||||
/// </summary>
|
||||
public IEnumerable<string> SlideDrillingModes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество метров пробуренных в роторе за отчетный период
|
||||
///<summary>
|
||||
/// Количество метров пробуренных в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? PenetrationInRotor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество часов бурения в роторе за отчетный период
|
||||
///<summary>
|
||||
/// Количество часов бурения в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? NumberDrillingHours { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///средний диф перепад в роторе за отчетный период
|
||||
///<summary>
|
||||
/// средний диф перепад в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? AVGDiffDropRotor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///количество метров пробуренных в слайде за отчетный период
|
||||
///<summary>
|
||||
/// количество метров пробуренных в слайде за отчетный период
|
||||
/// </summary>
|
||||
public double? PenetrationInSlide { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///время бурения в роторе за отчетный период
|
||||
///<summary>
|
||||
/// время бурения в роторе за отчетный период
|
||||
/// </summary>
|
||||
public double? DrillingTimeInRotor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///средний диф перепад в слайде за отчетный период
|
||||
///<summary>
|
||||
/// средний диф перепад в слайде за отчетный период
|
||||
/// </summary>
|
||||
public double? AVGDiffPressureSlide { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Плановая МСП за секцию
|
||||
///<summary>
|
||||
/// Плановая МСП за секцию
|
||||
/// </summary>
|
||||
public double? SectionROPPlan { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Общее время бурения за секцию
|
||||
///<summary>
|
||||
/// Общее время бурения за секцию
|
||||
/// </summary>
|
||||
public double? SectionDrillingTimeTotal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Общая проходка за секцию
|
||||
///<summary>
|
||||
/// Общая проходка за секцию
|
||||
/// </summary>
|
||||
public double? SectionPenetrationTotal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Количество наращиваний за отчетный период
|
||||
///<summary>
|
||||
/// Количество наращиваний за отчетный период
|
||||
/// </summary>
|
||||
public int ExtensionsCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///Отклонение относительно ГГД
|
||||
///<summary>
|
||||
/// Отклонение относительно ГГД
|
||||
/// </summary>
|
||||
public double? DeviationFromTVD { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///указываются все причины, которые влияют на снижение МСП.
|
||||
///<summary>
|
||||
/// указываются все причины, которые влияют на снижение МСП.
|
||||
/// </summary>
|
||||
public string DeclinesReasonsROP { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО Мастера буровой
|
||||
///<summary>
|
||||
/// ФИО Мастера буровой
|
||||
/// </summary>
|
||||
public string DrillingMaster { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///ФИО супервайзера
|
||||
///<summary>
|
||||
/// ФИО супервайзера
|
||||
/// </summary>
|
||||
public string Supervisor { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -10,46 +10,43 @@ namespace AsbCloudDb.Model
|
||||
{
|
||||
DbSet<Cluster> Clusters { get; set; }
|
||||
DbSet<Company> Companies { get; set; }
|
||||
DbSet<TelemetryDataSaub> TelemetryDataSaub { get; set; }
|
||||
DbSet<DailyReport> DailyReports { get; set; }
|
||||
DbSet<Deposit> Deposits { get; set; }
|
||||
DbSet<TelemetryEvent> TelemetryEvents { get; set; }
|
||||
DbSet<TelemetryMessage> TelemetryMessages { get; set; }
|
||||
DbSet<User> Users { get; set; }
|
||||
DbSet<UserRole> UserRoles { get; set; }
|
||||
DbSet<ReportProperty> ReportProperties { get; set; }
|
||||
DbSet<DrillFlowChart> DrillFlowChart { get; set; }
|
||||
DbSet<DrillingProgramPart> DrillingProgramParts { get; set; }
|
||||
DbSet<DrillParams> DrillParams { get; set; }
|
||||
DbSet<FileCategory> FileCategories { get; set; }
|
||||
DbSet<FileInfo> Files { get; set; }
|
||||
DbSet<FileMark> FileMarks { get; set; }
|
||||
DbSet<FileCategory> FileCategories { get; set; }
|
||||
DbSet<Telemetry> Telemetries { get; set; }
|
||||
DbSet<TelemetryUser> TelemetryUsers { get; set; }
|
||||
DbSet<WellOperationCategory> WellOperationCategories { get; set; }
|
||||
DbSet<TelemetryAnalysis> TelemetryAnalysis { get; set; }
|
||||
DbSet<Well> Wells { get; set; }
|
||||
DbSet<WellComposite> WellComposites { get; set; }
|
||||
DbSet<WellSectionType> WellSectionTypes { get; set; }
|
||||
DbSet<WellOperation> WellOperations { get; set; }
|
||||
DbSet<WellType> WellTypes { get; set; }
|
||||
DbSet<Measure> Measures { get; set; }
|
||||
DbSet<MeasureCategory> MeasureCategories { get; set; }
|
||||
DbSet<TelemetryDataSpin> TelemetryDataSpin { get; set; }
|
||||
DbSet<DrillParams> DrillParams { get; set; }
|
||||
DbSet<DrillFlowChart> DrillFlowChart { get; set; }
|
||||
DbSet<RelationUserUserRole> RelationUserUserRoles { get; set; }
|
||||
DbSet<Permission> Permissions { get; set; }
|
||||
DbSet<RelationCompanyWell> RelationCompaniesWells { get; set; }
|
||||
DbSet<RelationUserDrillingProgramPart> RelationDrillingProgramPartUsers { get; set; }
|
||||
DbSet<RelationUserRolePermission> RelationUserRolePermissions { get; set; }
|
||||
DbSet<RelationUserUserRole> RelationUserUserRoles { get; set; }
|
||||
DbSet<ReportProperty> ReportProperties { get; set; }
|
||||
DbSet<Telemetry> Telemetries { get; set; }
|
||||
DbSet<TelemetryAnalysis> TelemetryAnalysis { get; set; }
|
||||
DbSet<TelemetryDataSaub> TelemetryDataSaub { get; set; }
|
||||
DbSet<TelemetryDataSpin> TelemetryDataSpin { get; set; }
|
||||
DbSet<TelemetryEvent> TelemetryEvents { get; set; }
|
||||
DbSet<TelemetryMessage> TelemetryMessages { get; set; }
|
||||
DbSet<TelemetryUser> TelemetryUsers { get; set; }
|
||||
DbSet<User> Users { get; set; }
|
||||
DbSet<UserRole> UserRoles { get; set; }
|
||||
DbSet<Well> Wells { get; set; }
|
||||
DbSet<WellComposite> WellComposites { get; set; }
|
||||
DbSet<WellOperation> WellOperations { get; set; }
|
||||
DbSet<WellOperationCategory> WellOperationCategories { get; set; }
|
||||
DbSet<WellSectionType> WellSectionTypes { get; set; }
|
||||
DbSet<WellType> WellTypes { get; set; }
|
||||
|
||||
DatabaseFacade Database { get; }
|
||||
DbSet<DrillingProgramPart> DrillingProgramParts { get; set; }
|
||||
DbSet<RelationUserDrillingProgramPart> RelationDrillingProgramPartUsers { get; set; }
|
||||
DbSet<RelationCompanyWell> RelationCompaniesWells { get; set; }
|
||||
DbSet<DailyReport> DailyReport { get; set; }
|
||||
|
||||
int SaveChanges();
|
||||
int SaveChanges(bool acceptAllChangesOnSuccess);
|
||||
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
|
||||
|
||||
DbSet<TEntity> Set<TEntity>(string name) where TEntity : class;
|
||||
|
||||
DbSet<TEntity> Set<TEntity>() where TEntity : class;
|
||||
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ using AsbCloudDb.Model;
|
||||
using AsbCloudInfrastructure.Services;
|
||||
using AsbCloudInfrastructure.Services.Analysis;
|
||||
using AsbCloudInfrastructure.Services.Cache;
|
||||
using AsbCloudInfrastructure.Services.DailyReport;
|
||||
using AsbCloudInfrastructure.Services.DrillingProgram;
|
||||
using AsbCloudInfrastructure.Services.SAUB;
|
||||
using AsbCloudInfrastructure.Services.WellOperationService;
|
||||
@ -85,6 +86,7 @@ namespace AsbCloudInfrastructure
|
||||
services.AddTransient<IWellOperationImportService, WellOperationImportService>();
|
||||
services.AddTransient<IWellOperationService, WellOperationService>();
|
||||
services.AddTransient<IScheduleReportService, ScheduleReportService>();
|
||||
services.AddTransient<IDailyReportService, DailyReportService>();
|
||||
|
||||
// admin crud services:
|
||||
services.AddTransient<ICrudService<TelemetryDto>, CrudServiceBase<TelemetryDto, Telemetry>>(); // может быть включен в сервис TelemetryService
|
||||
|
@ -0,0 +1,299 @@
|
||||
using AsbCloudApp.Data;
|
||||
using ClosedXML.Excel;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
namespace AsbCloudInfrastructure.Services.DailyReport
|
||||
{
|
||||
public class DailyReportMakerExcel
|
||||
{
|
||||
public Stream MakeReport(DailyReportDto dailyReportDto)
|
||||
{
|
||||
using var templateStream = System.Reflection.Assembly.GetExecutingAssembly()
|
||||
.GetManifestResourceStream("AsbCloudInfrastructure.Services.DailyReport.DailyReportTemplate.xlsx");
|
||||
using var workbook = new XLWorkbook(templateStream, XLEventTracking.Disabled);
|
||||
FillSheet(workbook, dailyReportDto);
|
||||
|
||||
MemoryStream memoryStream = new MemoryStream();
|
||||
workbook.SaveAs(memoryStream, new SaveOptions { });
|
||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||
return memoryStream;
|
||||
}
|
||||
|
||||
public void FillSheet(XLWorkbook workbook, DailyReportDto reportParams)
|
||||
{
|
||||
var sheet = workbook.Worksheets.First();//.Add(reportParams.ReportDate.ToString("dd.MM.yyyy"));
|
||||
sheet.Name = reportParams.ReportDate.ToString("dd.MM.yyyy");
|
||||
|
||||
var activeRow = 3;
|
||||
activeRow = AddBlockHead(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockSlaughtersReport(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockTrajectoryReport(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockDrillers(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockSAUB(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockBHA(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockBHADescription(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockOperations(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockTimeBalans(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockMeterlessWorks(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockDrillingModes(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockRotorDrilling(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockSlideDrilling(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockROPPlan(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockSummary(sheet, activeRow, reportParams);
|
||||
activeRow = AddBlockSubscribes(sheet, activeRow, reportParams);
|
||||
}
|
||||
|
||||
private int AddBlockHead(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow, 3).Value =
|
||||
$"Суточная сводка бурения скважины №{reportDto.WellName}, куст: {reportDto.ClusterName}";
|
||||
sheet.Cell(startRow + 1, 3).Value =
|
||||
$"Заказчик: {reportDto.Customer}";
|
||||
sheet.Cell(startRow + 2, 3).Value =
|
||||
$"Подрядчик: {reportDto.Contractor}";
|
||||
|
||||
return startRow + 2;
|
||||
}
|
||||
|
||||
private int AddBlockSlaughtersReport(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 4, 3).Value =
|
||||
$"{reportDto.ReportDate}";
|
||||
sheet.Cell(startRow + 4, 5).Value =
|
||||
$"{reportDto.WellDepthIntervalStartDate}";
|
||||
sheet.Cell(startRow + 4, 6).Value =
|
||||
$"{reportDto.WellDepthIntervalFinishDate}";
|
||||
|
||||
return startRow + 4;
|
||||
}
|
||||
|
||||
private int AddBlockTrajectoryReport(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 4, 3).Value =
|
||||
$"{reportDto.BottomholeDepth}";
|
||||
sheet.Cell(startRow + 4, 4).Value =
|
||||
$"{reportDto.VerticalDepth}";
|
||||
sheet.Cell(startRow + 4, 5).Value =
|
||||
$"{reportDto.ZenithAngle}";
|
||||
sheet.Cell(startRow + 4, 6).Value =
|
||||
$"{reportDto.AzimuthAngle}";
|
||||
|
||||
return startRow + 4;
|
||||
}
|
||||
|
||||
private int AddBlockDrillers(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 2, 4).Value =
|
||||
$"{reportDto.FirstDriller}";
|
||||
sheet.Cell(startRow + 3, 4).Value =
|
||||
$"{reportDto.SecondDriller}";
|
||||
|
||||
return startRow + 3;
|
||||
}
|
||||
|
||||
private int AddBlockSAUB(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 3, 6).Value =
|
||||
$"{reportDto.WorkTimeSAUB}";
|
||||
sheet.Cell(startRow + 4, 6).Value =
|
||||
$"{reportDto.WorkTimeSpinMaster}";
|
||||
sheet.Cell(startRow + 5, 6).Value =
|
||||
$"{reportDto.WorkTimeTorkMaster}";
|
||||
sheet.Cell(startRow + 3, 7).Value =
|
||||
$"{reportDto.PenetrationSAUB}";
|
||||
sheet.Cell(startRow + 4, 7).Value =
|
||||
$"{reportDto.PenetrationSpinMaster}";
|
||||
sheet.Cell(startRow + 5, 7).Value =
|
||||
$"{reportDto.PenetrationTorkMaster}";
|
||||
sheet.Cell(startRow + 6, 6).Value =
|
||||
$"{reportDto.CountLaunchesMSE}";
|
||||
|
||||
return startRow + 6;
|
||||
}
|
||||
|
||||
private int AddBlockBHA(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 3, 6).Value =
|
||||
$"{reportDto.WorkTimeSAUB}";
|
||||
sheet.Cell(startRow + 4, 6).Value =
|
||||
$"{reportDto.WorkTimeSpinMaster}";
|
||||
sheet.Cell(startRow + 5, 6).Value =
|
||||
$"{reportDto.WorkTimeTorkMaster}";
|
||||
sheet.Cell(startRow + 3, 7).Value =
|
||||
$"{reportDto.PenetrationSAUB}";
|
||||
sheet.Cell(startRow + 4, 7).Value =
|
||||
$"{reportDto.PenetrationSpinMaster}";
|
||||
sheet.Cell(startRow + 5, 7).Value =
|
||||
$"{reportDto.PenetrationTorkMaster}";
|
||||
sheet.Cell(startRow + 6, 6).Value =
|
||||
$"{reportDto.CountLaunchesMSE}";
|
||||
|
||||
return startRow + 6;
|
||||
}
|
||||
|
||||
private int AddBlockBHADescription(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 2, 3).Value =
|
||||
$"{reportDto.BHADescription}";
|
||||
|
||||
return startRow + 6;
|
||||
}
|
||||
|
||||
private int AddBlockOperations(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
return startRow + 7;
|
||||
}
|
||||
|
||||
private int AddBlockTimeBalans(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
return startRow + 8;
|
||||
}
|
||||
|
||||
private int AddBlockMeterlessWorks(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 4, 6).Value =
|
||||
$"{reportDto.StandardTimeBarrelPreparation}";
|
||||
sheet.Cell(startRow + 4, 9).Value =
|
||||
$"{reportDto.StandardTimeExtension}";
|
||||
sheet.Cell(startRow + 6, 6).Value =
|
||||
$"{reportDto.ActualTimeBarrelPreparation}";
|
||||
sheet.Cell(startRow + 6, 9).Value =
|
||||
$"{reportDto.ActualTimeExtension}";
|
||||
|
||||
return startRow + 9;
|
||||
}
|
||||
|
||||
private int AddBlockDrillingModes(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 2, 6).Value =
|
||||
$"{reportDto.RotorDrillingModes}";
|
||||
sheet.Cell(startRow + 3, 9).Value =
|
||||
$"{reportDto.SlideDrillingModes}";
|
||||
|
||||
return startRow + 3;
|
||||
}
|
||||
|
||||
private int AddBlockRotorDrilling(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 3, 3).Value =
|
||||
$"{reportDto.PenetrationInRotor}";
|
||||
sheet.Cell(startRow + 3, 5).Value =
|
||||
$"{reportDto.NumberDrillingHours}";
|
||||
sheet.Cell(startRow + 3, 9).Value =
|
||||
$"{reportDto.AVGDiffDropRotor}";
|
||||
|
||||
return startRow + 3;
|
||||
}
|
||||
|
||||
private int AddBlockSlideDrilling(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 3, 3).Value =
|
||||
$"{reportDto.PenetrationInSlide}";
|
||||
sheet.Cell(startRow + 3, 5).Value =
|
||||
$"{reportDto.DrillingTimeInRotor}";
|
||||
sheet.Cell(startRow + 3, 9).Value =
|
||||
$"{reportDto.AVGDiffPressureSlide}";
|
||||
|
||||
return startRow + 3;
|
||||
}
|
||||
|
||||
private int AddBlockROPPlan(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 3, 9).Value =
|
||||
$"{reportDto.SectionROPPlan}";
|
||||
|
||||
return startRow + 3;
|
||||
}
|
||||
|
||||
private int AddBlockSummary(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 7, 7).Value =
|
||||
$"{reportDto.SectionDrillingTimeTotal}";
|
||||
sheet.Cell(startRow + 8, 7).Value =
|
||||
$"{reportDto.SectionPenetrationTotal}";
|
||||
sheet.Cell(startRow + 9, 7).Value =
|
||||
$"{reportDto.ExtensionsCount}";
|
||||
sheet.Cell(startRow + 10, 7).Value =
|
||||
$"{reportDto.DeviationFromTVD}";
|
||||
sheet.Cell(startRow + 11, 3).Value =
|
||||
$"{reportDto.DeclinesReasonsROP}";
|
||||
|
||||
return startRow + 13;
|
||||
}
|
||||
private int AddBlockSubscribes(IXLWorksheet sheet, int startRow, DailyReportDto reportDto)
|
||||
{
|
||||
sheet.Cell(startRow + 3, 9).Value =
|
||||
$"{reportDto.DrillingMaster}";
|
||||
sheet.Cell(startRow + 5, 9).Value =
|
||||
$"{reportDto.Supervisor}";
|
||||
|
||||
return startRow + 5;
|
||||
}
|
||||
|
||||
private static string GetColunmLetter(int columnNumber)
|
||||
{
|
||||
string letter = "";
|
||||
|
||||
while (columnNumber > 0)
|
||||
{
|
||||
int modulo = (columnNumber - 1) % 26;
|
||||
letter = Convert.ToChar('A' + modulo) + letter;
|
||||
columnNumber = (columnNumber - modulo) / 26;
|
||||
}
|
||||
|
||||
return letter;
|
||||
}
|
||||
|
||||
private static IXLStyle SetBorder(IXLStyle style)
|
||||
{
|
||||
style.Border.RightBorder = XLBorderStyleValues.Thin;
|
||||
style.Border.LeftBorder = XLBorderStyleValues.Thin;
|
||||
style.Border.TopBorder = XLBorderStyleValues.Thin;
|
||||
style.Border.BottomBorder = XLBorderStyleValues.Thin;
|
||||
style.Border.InsideBorder = XLBorderStyleValues.Thin;
|
||||
return style;
|
||||
}
|
||||
|
||||
private static IXLCell SetDateTime(IXLCell cell)
|
||||
{
|
||||
cell.DataType = XLDataType.DateTime;
|
||||
cell.Style.DateFormat.Format = "DD.MM.YYYY HH:MM:SS";
|
||||
return cell;
|
||||
}
|
||||
|
||||
private static IXLCell SetNumber(IXLCell cell)
|
||||
{
|
||||
cell.DataType = XLDataType.Number;
|
||||
cell.Style.NumberFormat.Format = "0.00";
|
||||
return cell;
|
||||
}
|
||||
|
||||
private static IXLCell SetCell(IXLRow row, int colunm, object value, int maxChartsToWrap = 88)
|
||||
{
|
||||
var cell = row.Cell(colunm);
|
||||
cell.Value = value;
|
||||
|
||||
SetBorder(cell.Style);
|
||||
cell.Style.Alignment.WrapText = true;
|
||||
|
||||
if (value is string valueString && valueString.Length > maxChartsToWrap)
|
||||
{
|
||||
var baseHeight = row.Height;
|
||||
row.Height = 0.82d * baseHeight * Math.Ceiling(1d + valueString.Length / maxChartsToWrap);
|
||||
}
|
||||
|
||||
if (value is DateTime)
|
||||
{
|
||||
SetDateTime(cell);
|
||||
}
|
||||
else if (value is IFormattable)
|
||||
{
|
||||
SetNumber(cell);
|
||||
}
|
||||
|
||||
return cell;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,148 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Mapster;
|
||||
using AsbCloudApp.Data;
|
||||
using AsbCloudApp.Services;
|
||||
using AsbCloudDb.Model;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AsbCloudInfrastructure.Services.DailyReport
|
||||
{
|
||||
#nullable enable
|
||||
public class DailyReportService : IDailyReportService
|
||||
{
|
||||
private readonly IAsbCloudDbContext db;
|
||||
private readonly IWellService wellService;
|
||||
private readonly DailyReportMakerExcel dailyReportMaker = new DailyReportMakerExcel();
|
||||
|
||||
public DailyReportService(IAsbCloudDbContext db, IWellService wellService)
|
||||
{
|
||||
this.db = db;
|
||||
this.wellService = wellService;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<DailyReportDto>> GetListAsync(int idWell, DateTime? begin, DateTime? end, CancellationToken token)
|
||||
{
|
||||
var query = db.DailyReports.Where(r => r.IdWell == idWell);
|
||||
var offsetHours = wellService.GetTimezone(idWell).Hours;
|
||||
|
||||
if (begin is not null)
|
||||
{
|
||||
var beginOffset = ((DateTime)begin).ToUtcDateTimeOffset(offsetHours);
|
||||
query = query.Where(d => d.StartDate >= beginOffset);
|
||||
}
|
||||
|
||||
if (end is not null)
|
||||
{
|
||||
var endOffset = ((DateTime)end).ToUtcDateTimeOffset(offsetHours);
|
||||
query = query.Where(d => d.StartDate <= endOffset);
|
||||
}
|
||||
|
||||
var entities = await query
|
||||
.ToListAsync(token);
|
||||
|
||||
return entities.Select(r => Convert(r, offsetHours));
|
||||
}
|
||||
|
||||
public async Task<DailyReportDto> GetOrGenerateAsync(int idWell, DateTime date, CancellationToken token)
|
||||
{
|
||||
var dailyReportDto = await GetAsync(idWell, date, token);
|
||||
if (dailyReportDto is null)
|
||||
return await MakeDefaultDailyReportAsync(idWell, token);
|
||||
else
|
||||
return dailyReportDto;
|
||||
}
|
||||
|
||||
public async Task<int> AddAsync(int idWell, DailyReportDto dto, CancellationToken token = default)
|
||||
{
|
||||
var offsetHours = wellService.GetTimezone(idWell).Hours;
|
||||
var reportDateOffset = dto.ReportDate.ToUtcDateTimeOffset(offsetHours);
|
||||
var info = Convert(dto, offsetHours);
|
||||
var entity = new AsbCloudDb.Model.DailyReport
|
||||
{
|
||||
IdWell = idWell,
|
||||
StartDate = reportDateOffset,
|
||||
Info = info,
|
||||
};
|
||||
db.DailyReports.Add(entity);
|
||||
var result = await db.SaveChangesAsync(token);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<int> UpdateAsync(int idWell, DateTime date, DailyReportDto dto, CancellationToken token)
|
||||
{
|
||||
var offsetHours = wellService.GetTimezone(idWell).Hours;
|
||||
var reportDateOffset = date.ToUtcDateTimeOffset(offsetHours);
|
||||
var entity = await db.DailyReports
|
||||
.FirstOrDefaultAsync(r => r.IdWell == idWell && r.StartDate == reportDateOffset, token);
|
||||
|
||||
if (entity is null)
|
||||
return 0;
|
||||
|
||||
entity.Info = Convert(dto, offsetHours);
|
||||
db.DailyReports.Update(entity);
|
||||
|
||||
var result = await db.SaveChangesAsync(token);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Stream?> MakeReportAsync(int idWell, DateTime date, CancellationToken token = default)
|
||||
{
|
||||
var dailyReportDto = await GetAsync(idWell, date, token);
|
||||
if (dailyReportDto is null)
|
||||
return null;
|
||||
|
||||
var memoryStream = dailyReportMaker.MakeReport(dailyReportDto);
|
||||
return memoryStream;
|
||||
}
|
||||
|
||||
private async Task<DailyReportDto?> GetAsync(int idWell, DateTime date, CancellationToken token)
|
||||
{
|
||||
var offsetHours = wellService.GetTimezone(idWell).Hours;
|
||||
var dateOffset = date.ToUtcDateTimeOffset(offsetHours);
|
||||
var query = db.DailyReports
|
||||
.Where(r => r.IdWell == idWell)
|
||||
.Where(d => d.StartDate == dateOffset);
|
||||
|
||||
var data = await query.FirstOrDefaultAsync(token);
|
||||
if (data is null)
|
||||
return null;
|
||||
else
|
||||
return Convert(data, offsetHours);
|
||||
}
|
||||
|
||||
private async Task<DailyReportDto> MakeDefaultDailyReportAsync(int idWell, CancellationToken token)
|
||||
{
|
||||
var well = await wellService.GetAsync(idWell, token);
|
||||
var offsetHours = wellService.GetTimezone(idWell).Hours;
|
||||
var dto = new DailyReportDto()
|
||||
{
|
||||
ReportDate = DateTimeOffset.UtcNow.ToRemoteDateTime(offsetHours),
|
||||
WellName = well.Caption,
|
||||
ClusterName = well.Cluster,
|
||||
|
||||
};
|
||||
DailyReportDto result = dto;
|
||||
return result;
|
||||
}
|
||||
|
||||
private static DailyReportDto Convert(AsbCloudDb.Model.DailyReport entity, double offsetHours)
|
||||
{
|
||||
var dto = entity.Info.Adapt<DailyReportDto>();
|
||||
dto.ReportDate = entity.StartDate.ToRemoteDateTime(offsetHours);
|
||||
return dto;
|
||||
}
|
||||
|
||||
private static DailyReportInfo Convert(DailyReportDto dto, double offsetHours)
|
||||
{
|
||||
var entity = dto.Adapt<DailyReportInfo>();
|
||||
entity.ReportDate = dto.ReportDate.ToUtcDateTimeOffset(offsetHours);
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
#nullable disable
|
||||
}
|
@ -4,9 +4,9 @@ using Microsoft.AspNetCore.Mvc;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AsbCloudApp.Services;
|
||||
|
||||
namespace AsbCloudWebApi.Controllers
|
||||
{
|
||||
@ -15,6 +15,15 @@ namespace AsbCloudWebApi.Controllers
|
||||
[Authorize]
|
||||
public class DailyReportController : ControllerBase
|
||||
{
|
||||
private readonly IDailyReportService dailyReportService;
|
||||
private readonly IWellService wellService;
|
||||
|
||||
public DailyReportController(IDailyReportService dailyReportService, IWellService wellService)
|
||||
{
|
||||
this.dailyReportService = dailyReportService;
|
||||
this.wellService = wellService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Список наборов данных для формирования рапорта
|
||||
/// </summary>
|
||||
@ -28,12 +37,7 @@ namespace AsbCloudWebApi.Controllers
|
||||
[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)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
var dto = new DailyReportDto
|
||||
{
|
||||
};
|
||||
|
||||
var result = new List<DailyReportDto> { dto };
|
||||
var result = await dailyReportService.GetListAsync(idWell, begin, end, token);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
@ -49,11 +53,7 @@ namespace AsbCloudWebApi.Controllers
|
||||
[ProducesResponseType(typeof(DailyReportDto), (int)System.Net.HttpStatusCode.OK)]
|
||||
public async Task<IActionResult> GetOrGenerateAsync(int idWell, [Required] DateTime date, CancellationToken token = default)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
var dto = new DailyReportDto
|
||||
{
|
||||
ReportDate = date,
|
||||
};
|
||||
var dto = await dailyReportService.GetOrGenerateAsync(idWell, date, token);
|
||||
return Ok(dto);
|
||||
}
|
||||
|
||||
@ -67,10 +67,10 @@ namespace AsbCloudWebApi.Controllers
|
||||
[HttpPost]
|
||||
//[Permission]
|
||||
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||
public async Task<IActionResult> AddAsync(int idWell, [Required] DailyReportDto dto, CancellationToken token = default)
|
||||
public async Task<IActionResult> AddAsync(int idWell, [Required][FromBody] DailyReportDto dto, CancellationToken token = default)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
return Ok(1);
|
||||
var result = await dailyReportService.AddAsync(idWell, dto, token);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -86,8 +86,8 @@ namespace AsbCloudWebApi.Controllers
|
||||
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||
public async Task<IActionResult> UpdateAsync(int idWell, [Required] DateTime date, [Required] DailyReportDto dto, CancellationToken token = default)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
return Ok(1);
|
||||
var result = await dailyReportService.UpdateAsync(idWell, date, dto, token);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -99,19 +99,16 @@ namespace AsbCloudWebApi.Controllers
|
||||
[HttpGet("{date}/excel")]
|
||||
//[Permission]
|
||||
[ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)]
|
||||
public async Task<IActionResult> DownloadAsync(int idWell, CancellationToken token = default)
|
||||
public async Task<IActionResult> DownloadAsync(int idWell, DateTime date, CancellationToken token = default)
|
||||
{
|
||||
await Task.Delay(1);
|
||||
var stream = GetExcelTemplateStream();
|
||||
var fileName = "CP.xlsx";
|
||||
return File(stream, "application/octet-stream", fileName);
|
||||
}
|
||||
|
||||
private static Stream GetExcelTemplateStream()
|
||||
{
|
||||
var assembly = System.Reflection.Assembly.GetAssembly(typeof(AsbCloudInfrastructure.IInfrastructureMarker));
|
||||
var stream = assembly.GetManifestResourceStream("AsbCloudInfrastructure.Services.DailyReport.DailyReportTemplate.xlsx");
|
||||
return stream;
|
||||
var stream = await dailyReportService.MakeReportAsync(idWell, date, token);
|
||||
if (stream != null)
|
||||
{
|
||||
var fileName = "CP.xlsx";
|
||||
return File(stream, "application/octet-stream", fileName);
|
||||
}
|
||||
else
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using AsbCloudInfrastructure.Services.DailyReport;
|
||||
using System;
|
||||
|
||||
namespace ConsoleApp1
|
||||
{
|
||||
@ -8,7 +9,20 @@ namespace ConsoleApp1
|
||||
static void Main(/*string[] args*/)
|
||||
{
|
||||
// use ServiceFactory to make services
|
||||
var makerExcel = new DailyReportMakerExcel();
|
||||
|
||||
AsbCloudApp.Data.DailyReportDto dto = new() {
|
||||
WellName = "111",
|
||||
ClusterName = "cluster name",
|
||||
Contractor = "NaftaGas",
|
||||
};
|
||||
|
||||
using var stream = makerExcel.MakeReport(dto);
|
||||
using (var fileStream = System.IO.File.Create(@"c:/temp/1.xlsx"))
|
||||
{
|
||||
stream.CopyTo(fileStream);
|
||||
fileStream.Flush();
|
||||
}
|
||||
|
||||
Console.WriteLine("End of Test");
|
||||
Console.ReadLine();
|
||||
|
Loading…
Reference in New Issue
Block a user