merge and fix

This commit is contained in:
ngfrolov 2022-05-05 10:06:15 +05:00
commit 24b40973bb
10 changed files with 701 additions and 229 deletions

View File

@ -4,213 +4,213 @@ using System.Collections.Generic;
namespace AsbCloudApp.Data namespace AsbCloudApp.Data
{ {
/// <summary> /// <summary>
/// /// Параметры для формирования суточного рапорта
/// </summary> /// </summary>
public class DailyReportDto public class DailyReportDto
{ {
/// <summary> /// <summary>
///название скважины /// название скважины
/// <summary> /// </summary>
public string WellName { get; set; } public string WellName { get; set; }
///<summary> /// <summary>
///название куста /// название куста
///<summary> /// </summary>
public string ClusterName { get; set; } public string ClusterName { get; set; }
/// <summary> /// <summary>
///заказчик /// заказчик
///<summary> /// </summary>
public string Customer { get; set; } public string Customer { get; set; }
/// <summary> /// <summary>
///подрядчик /// подрядчик
///<summary> /// </summary>
public string Contractor { get; set; } public string Contractor { get; set; }
/// <summary> /// <summary>
///дата рапорта /// дата рапорта
///<summary> /// </summary>
public DateTime ReportDate { get; set; } public DateTime ReportDate { get; set; }
/// <summary> /// <summary>
///глубина забоя на дату начала интервала /// глубина забоя на дату начала интервала
///<summary> /// </summary>
public double? WellDepthIntervalStartDate { get; set; } public double? WellDepthIntervalStartDate { get; set; }
/// <summary> /// <summary>
///глубина забоя на дату окончания интервала /// глубина забоя на дату окончания интервала
///<summary> /// </summary>
public double? WellDepthIntervalFinishDate { get; set; } public double? WellDepthIntervalFinishDate { get; set; }
/// <summary> /// <summary>
///Глубина забоя по стволу на окончание отчетного периода /// Глубина забоя по стволу на окончание отчетного периода
///<summary> /// </summary>
public double? BottomholeDepth { get; set; } public double? BottomholeDepth { get; set; }
/// <summary> /// <summary>
///Глубина забоя по вертикали на дату окончания отчетного периода /// Глубина забоя по вертикали на дату окончания отчетного периода
///<summary> /// </summary>
public double? VerticalDepth { get; set; } public double? VerticalDepth { get; set; }
/// <summary> /// <summary>
///Зeнитный угол на дату окончания отчетного периода /// Зенитный угол на дату окончания отчетного периода
///<summary> /// </summary>
public double? ZenithAngle { get; set; } public double? ZenithAngle { get; set; }
/// <summary> /// <summary>
///Азимутальный угол на дату окончания отчетного периода /// Азимутальный угол на дату окончания отчетного периода
///<summary> /// </summary>
public double? AzimuthAngle { get; set; } public double? AzimuthAngle { get; set; }
/// <summary> /// <summary>
///ФИО бурильщиков /// ФИО бурильщиков
///<summary> /// </summary>
public string FirstDriller { get; set; } public string FirstDriller { get; set; }
/// <summary> /// <summary>
///ФИО бурильщиков /// ФИО бурильщиков
///<summary> /// </summary>
public string SecondDriller { get; set; } public string SecondDriller { get; set; }
/// <summary> /// <summary>
///Время работы АПД /// Время работы АПД
///<summary> /// </summary>
public double? WorkTimeSAUB { get; set; } public double? WorkTimeSAUB { get; set; }
/// <summary> /// <summary>
///Время работы спин мастер /// Время работы спин мастер
///<summary> /// </summary>
public double? WorkTimeSpinMaster { get; set; } public double? WorkTimeSpinMaster { get; set; }
/// <summary> /// <summary>
///Время работы торк мастер /// Время работы torqueMaster
///<summary> /// </summary>
public double? WorkTimeTorkMaster { get; set; } public double? WorkTimeTorkMaster { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных с включенным АПД /// количество метров пробуренных с включенным АПД
///<summary> /// </summary>
public double? PenetrationSAUB { get; set; } public double? PenetrationSAUB { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных с включенным Спин мастер /// количество метров пробуренных с включенным Спин мастер
///<summary> /// </summary>
public double? PenetrationSpinMaster { get; set; } public double? PenetrationSpinMaster { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных с включенным торк мастер /// количество метров пробуренных с включенным torqueMaster
///<summary> /// </summary>
public double? PenetrationTorkMaster { get; set; } public double? PenetrationTorkMaster { get; set; }
/// <summary> /// <summary>
///Количество запусков МСЕ /// Количество запусков МСЕ
///<summary> /// </summary>
public int CountLaunchesMSE { get; set; } public int CountLaunchesMSE { get; set; }
/// <summary> /// <summary>
///КНБК описание /// КНБК описание
///<summary> /// </summary>
public string BHADescription { get; set; } public string BHADescription { get; set; }
/// <summary> /// <summary>
///Нормативное время на одну операцию по подготовке ствола скважины к наращиванию /// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
///<summary> /// </summary>
public double? StandardTimeBarrelPreparation { get; set; } public double? StandardTimeBarrelPreparation { get; set; }
/// <summary> /// <summary>
///Нормативное время на одну операцию по наращиванию /// Нормативное время на одну операцию по наращиванию
///<summary> /// </summary>
public double? StandardTimeExtension { get; set; } public double? StandardTimeExtension { get; set; }
/// <summary> /// <summary>
///Фактическое время проработок при подготовке ствола скважины к наращиванию. /// Фактическое время проработок при подготовке ствола скважины к наращиванию.
///<summary> /// </summary>
public double? ActualTimeBarrelPreparation { get; set; } public double? ActualTimeBarrelPreparation { get; set; }
/// <summary> /// <summary>
///Фактическое время наращиваний /// Фактическое время наращиваний
///<summary> /// </summary>
public double? ActualTimeExtension { get; set; } public double? ActualTimeExtension { get; set; }
/// <summary> /// <summary>
///Режимы бурения в роторе /// Режимы бурения в роторе
///<summary> /// </summary>
public IEnumerable<string> RotorDrillingModes { get; set; } public IEnumerable<string> RotorDrillingModes { get; set; }
/// <summary> /// <summary>
///режимы бурения в слайде /// режимы бурения в слайде
///<summary> /// </summary>
public IEnumerable<string> SlideDrillingModes { get; set; } public IEnumerable<string> SlideDrillingModes { get; set; }
/// <summary> /// <summary>
///Количество метров пробуренных в роторе за отчетный период /// Количество метров пробуренных в роторе за отчетный период
///<summary> /// </summary>
public double? PenetrationInRotor { get; set; } public double? PenetrationInRotor { get; set; }
/// <summary> /// <summary>
///Количество часов бурения в роторе за отчетный период /// Количество часов бурения в роторе за отчетный период
///<summary> /// </summary>
public double? NumberDrillingHours { get; set; } public double? NumberDrillingHours { get; set; }
/// <summary> /// <summary>
///средний диф перепад в роторе за отчетный период /// средний диф перепад в роторе за отчетный период
///<summary> /// </summary>
public double? AVGDiffDropRotor { get; set; } public double? AVGDiffDropRotor { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных в слайде за отчетный период /// количество метров пробуренных в слайде за отчетный период
///<summary> /// </summary>
public double? PenetrationInSlide { get; set; } public double? PenetrationInSlide { get; set; }
/// <summary> /// <summary>
///время бурения в роторе за отчетный период /// время бурения в роторе за отчетный период
///<summary> /// </summary>
public double? DrillingTimeInRotor { get; set; } public double? DrillingTimeInRotor { get; set; }
/// <summary> /// <summary>
///средний диф перепад в слайде за отчетный период /// средний диф. перепад в слайде за отчетный период
///<summary> /// </summary>
public double? AVGDiffPressureSlide { get; set; } public double? AVGDiffPressureSlide { get; set; }
/// <summary> /// <summary>
///Плановая МСП за секцию /// Плановая МСП за секцию
///<summary> /// </summary>
public double? SectionROPPlan { get; set; } public double? SectionROPPlan { get; set; }
/// <summary> /// <summary>
///Общее время бурения за секцию /// Общее время бурения за секцию
///<summary> /// </summary>
public double? SectionDrillingTimeTotal { get; set; } public double? SectionDrillingTimeTotal { get; set; }
/// <summary> /// <summary>
///Общая проходка за секцию /// Общая проходка за секцию
///<summary> /// </summary>
public double? SectionPenetrationTotal { get; set; } public double? SectionPenetrationTotal { get; set; }
/// <summary> /// <summary>
///Количество наращиваний за отчетный период /// Количество наращиваний за отчетный период
///<summary> /// </summary>
public int ExtensionsCount { get; set; } public int ExtensionsCount { get; set; }
/// <summary> /// <summary>
///Отклонение относительно ГГД /// Отклонение относительно ГГД
///<summary> /// </summary>
public double? DeviationFromTVD { get; set; } public double? DeviationFromTVD { get; set; }
/// <summary> /// <summary>
///указываются все причины, которые влияют на снижение МСП. /// указываются все причины, которые влияют на снижение МСП.
///<summary> /// </summary>
public string DeclinesReasonsROP { get; set; } public string DeclinesReasonsROP { get; set; }
/// <summary> /// <summary>
///ФИО Мастера буровой /// ФИО Мастера буровой
///<summary> /// </summary>
public string DrillingMaster { get; set; } public string DrillingMaster { get; set; }
/// <summary> /// <summary>
///ФИО супервайзера /// ФИО супервайзера
///<summary> /// </summary>
public string Supervisor { get; set; } public string Supervisor { get; set; }
} }
} }

View 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);
}
}

View File

@ -43,7 +43,7 @@ namespace AsbCloudDb.Model
public virtual DbSet<RelationUserRolePermission> RelationUserRolePermissions { get; set; } public virtual DbSet<RelationUserRolePermission> RelationUserRolePermissions { get; set; }
public virtual DbSet<RelationUserRoleUserRole> RelationUserRoleUserRoles { get; set; } public virtual DbSet<RelationUserRoleUserRole> RelationUserRoleUserRoles { get; set; }
public virtual DbSet<RelationUserDrillingProgramPart> RelationDrillingProgramPartUsers { get; set; } public virtual DbSet<RelationUserDrillingProgramPart> RelationDrillingProgramPartUsers { get; set; }
public virtual DbSet<DailyReport> DailyReport { get; set; } public virtual DbSet<DailyReport> DailyReports { get; set; }
// WITS // WITS
public DbSet<WITS.Record1> Record1 { get; set; } public DbSet<WITS.Record1> Record1 { get; set; }

View File

@ -1,216 +1,213 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AsbCloudDb.Model namespace AsbCloudDb.Model
{ {
public class DailyReportInfo public class DailyReportInfo
{ {
/// <summary> /// <summary>
///название скважины /// название скважины
/// <summary> /// </summary>
public string WellName { get; set; } public string WellName { get; set; }
///<summary> /// <summary>
///название куста /// название куста
///<summary> /// </summary>
public string ClusterName { get; set; } public string ClusterName { get; set; }
/// <summary> /// <summary>
///заказчик /// заказчик
///<summary> /// </summary>
public string Customer { get; set; } public string Customer { get; set; }
/// <summary> /// <summary>
///подрядчик /// подрядчик
///<summary> /// </summary>
public string Contractor { get; set; } public string Contractor { get; set; }
/// <summary> /// <summary>
///дата рапорта /// дата рапорта
///<summary> /// </summary>
public DateTime ReportDate { get; set; } public DateTimeOffset ReportDate { get; set; }
/// <summary> /// <summary>
///глубина забоя на дату начала интервала /// глубина забоя на дату начала интервала
///<summary> /// </summary>
public double? WellDepthIntervalStartDate { get; set; } public double? WellDepthIntervalStartDate { get; set; }
/// <summary> /// <summary>
///глубина забоя на дату окончания интервала /// глубина забоя на дату окончания интервала
///<summary> /// </summary>
public double? WellDepthIntervalFinishDate { get; set; } public double? WellDepthIntervalFinishDate { get; set; }
/// <summary> /// <summary>
///Глубина забоя по стволу на окончание отчетного периода /// Глубина забоя по стволу на окончание отчетного периода
///<summary> /// </summary>
public double? BottomholeDepth { get; set; } public double? BottomholeDepth { get; set; }
/// <summary> /// <summary>
///Глубина забоя по вертикали на дату окончания отчетного периода /// Глубина забоя по вертикали на дату окончания отчетного периода
///<summary> /// </summary>
public double? VerticalDepth { get; set; } public double? VerticalDepth { get; set; }
/// <summary> /// <summary>
///Зeнитный угол на дату окончания отчетного периода /// Зенитный угол на дату окончания отчетного периода
///<summary> /// </summary>
public double? ZenithAngle { get; set; } public double? ZenithAngle { get; set; }
/// <summary> /// <summary>
///Азимутальный угол на дату окончания отчетного периода /// Азимутальный угол на дату окончания отчетного периода
///<summary> /// </summary>
public double? AzimuthAngle { get; set; } public double? AzimuthAngle { get; set; }
/// <summary> /// <summary>
///ФИО бурильщиков /// ФИО бурильщиков
///<summary> /// </summary>
public string FirstDriller { get; set; } public string FirstDriller { get; set; }
/// <summary> /// <summary>
///ФИО бурильщиков /// ФИО бурильщиков
///<summary> /// </summary>
public string SecondDriller { get; set; } public string SecondDriller { get; set; }
/// <summary> /// <summary>
///Время работы АПД /// Время работы АПД
///<summary> /// </summary>
public double? WorkTimeSAUB { get; set; } public double? WorkTimeSAUB { get; set; }
/// <summary> /// <summary>
///Время работы спин мастер /// Время работы спин мастер
///<summary> /// </summary>
public double? WorkTimeSpinMaster { get; set; } public double? WorkTimeSpinMaster { get; set; }
/// <summary> /// <summary>
///Время работы торк мастер /// Время работы torqueMaster
///<summary> /// </summary>
public double? WorkTimeTorkMaster { get; set; } public double? WorkTimeTorkMaster { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных с включенным АПД /// количество метров пробуренных с включенным АПД
///<summary> /// </summary>
public double? PenetrationSAUB { get; set; } public double? PenetrationSAUB { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных с включенным Спин мастер /// количество метров пробуренных с включенным Спин мастер
///<summary> /// </summary>
public double? PenetrationSpinMaster { get; set; } public double? PenetrationSpinMaster { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных с включенным торк мастер /// количество метров пробуренных с включенным torqueMaster
///<summary> /// </summary>
public double? PenetrationTorkMaster { get; set; } public double? PenetrationTorkMaster { get; set; }
/// <summary> /// <summary>
///Количество запусков МСЕ /// Количество запусков МСЕ
///<summary> /// </summary>
public int CountLaunchesMSE { get; set; } public int CountLaunchesMSE { get; set; }
/// <summary> /// <summary>
///КНБК описание /// КНБК описание
///<summary> /// </summary>
public string BHADescription { get; set; } public string BHADescription { get; set; }
/// <summary> /// <summary>
///Нормативное время на одну операцию по подготовке ствола скважины к наращиванию /// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию
///<summary> /// </summary>
public double? StandardTimeBarrelPreparation { get; set; } public double? StandardTimeBarrelPreparation { get; set; }
/// <summary> /// <summary>
///Нормативное время на одну операцию по наращиванию /// Нормативное время на одну операцию по наращиванию
///<summary> /// </summary>
public double? StandardTimeExtension { get; set; } public double? StandardTimeExtension { get; set; }
/// <summary> /// <summary>
///Фактическое время проработок при подготовке ствола скважины к наращиванию. /// Фактическое время проработок при подготовке ствола скважины к наращиванию.
///<summary> /// </summary>
public double? ActualTimeBarrelPreparation { get; set; } public double? ActualTimeBarrelPreparation { get; set; }
/// <summary> /// <summary>
///Фактическое время наращиваний /// Фактическое время наращиваний
///<summary> /// </summary>
public double? ActualTimeExtension { get; set; } public double? ActualTimeExtension { get; set; }
/// <summary> /// <summary>
///Режимы бурения в роторе /// Режимы бурения в роторе
///<summary> /// </summary>
public IEnumerable<string> RotorDrillingModes { get; set; } public IEnumerable<string> RotorDrillingModes { get; set; }
/// <summary> /// <summary>
///режимы бурения в слайде /// режимы бурения в слайде
///<summary> /// </summary>
public IEnumerable<string> SlideDrillingModes { get; set; } public IEnumerable<string> SlideDrillingModes { get; set; }
/// <summary> /// <summary>
///Количество метров пробуренных в роторе за отчетный период /// Количество метров пробуренных в роторе за отчетный период
///<summary> /// </summary>
public double? PenetrationInRotor { get; set; } public double? PenetrationInRotor { get; set; }
/// <summary> /// <summary>
///Количество часов бурения в роторе за отчетный период /// Количество часов бурения в роторе за отчетный период
///<summary> /// </summary>
public double? NumberDrillingHours { get; set; } public double? NumberDrillingHours { get; set; }
/// <summary> /// <summary>
///средний диф перепад в роторе за отчетный период /// средний диф перепад в роторе за отчетный период
///<summary> /// </summary>
public double? AVGDiffDropRotor { get; set; } public double? AVGDiffDropRotor { get; set; }
/// <summary> /// <summary>
///количество метров пробуренных в слайде за отчетный период /// количество метров пробуренных в слайде за отчетный период
///<summary> /// </summary>
public double? PenetrationInSlide { get; set; } public double? PenetrationInSlide { get; set; }
/// <summary> /// <summary>
///время бурения в роторе за отчетный период /// время бурения в роторе за отчетный период
///<summary> /// </summary>
public double? DrillingTimeInRotor { get; set; } public double? DrillingTimeInRotor { get; set; }
/// <summary> /// <summary>
///средний диф перепад в слайде за отчетный период /// средний диф перепад в слайде за отчетный период
///<summary> /// </summary>
public double? AVGDiffPressureSlide { get; set; } public double? AVGDiffPressureSlide { get; set; }
/// <summary> /// <summary>
///Плановая МСП за секцию /// Плановая МСП за секцию
///<summary> /// </summary>
public double? SectionROPPlan { get; set; } public double? SectionROPPlan { get; set; }
/// <summary> /// <summary>
///Общее время бурения за секцию /// Общее время бурения за секцию
///<summary> /// </summary>
public double? SectionDrillingTimeTotal { get; set; } public double? SectionDrillingTimeTotal { get; set; }
/// <summary> /// <summary>
///Общая проходка за секцию /// Общая проходка за секцию
///<summary> /// </summary>
public double? SectionPenetrationTotal { get; set; } public double? SectionPenetrationTotal { get; set; }
/// <summary> /// <summary>
///Количество наращиваний за отчетный период /// Количество наращиваний за отчетный период
///<summary> /// </summary>
public int ExtensionsCount { get; set; } public int ExtensionsCount { get; set; }
/// <summary> /// <summary>
///Отклонение относительно ГГД /// Отклонение относительно ГГД
///<summary> /// </summary>
public double? DeviationFromTVD { get; set; } public double? DeviationFromTVD { get; set; }
/// <summary> /// <summary>
///указываются все причины, которые влияют на снижение МСП. /// указываются все причины, которые влияют на снижение МСП.
///<summary> /// </summary>
public string DeclinesReasonsROP { get; set; } public string DeclinesReasonsROP { get; set; }
/// <summary> /// <summary>
///ФИО Мастера буровой /// ФИО Мастера буровой
///<summary> /// </summary>
public string DrillingMaster { get; set; } public string DrillingMaster { get; set; }
/// <summary> /// <summary>
///ФИО супервайзера /// ФИО супервайзера
///<summary> /// </summary>
public string Supervisor { get; set; } public string Supervisor { get; set; }
} }
} }

View File

@ -10,46 +10,43 @@ namespace AsbCloudDb.Model
{ {
DbSet<Cluster> Clusters { get; set; } DbSet<Cluster> Clusters { get; set; }
DbSet<Company> Companies { get; set; } DbSet<Company> Companies { get; set; }
DbSet<TelemetryDataSaub> TelemetryDataSaub { get; set; } DbSet<DailyReport> DailyReports { get; set; }
DbSet<Deposit> Deposits { get; set; } DbSet<Deposit> Deposits { get; set; }
DbSet<TelemetryEvent> TelemetryEvents { get; set; } DbSet<DrillFlowChart> DrillFlowChart { get; set; }
DbSet<TelemetryMessage> TelemetryMessages { get; set; } DbSet<DrillingProgramPart> DrillingProgramParts { get; set; }
DbSet<User> Users { get; set; } DbSet<DrillParams> DrillParams { get; set; }
DbSet<UserRole> UserRoles { get; set; } DbSet<FileCategory> FileCategories { get; set; }
DbSet<ReportProperty> ReportProperties { get; set; }
DbSet<FileInfo> Files { get; set; } DbSet<FileInfo> Files { get; set; }
DbSet<FileMark> FileMarks { 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<Measure> Measures { get; set; }
DbSet<MeasureCategory> MeasureCategories { 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<Permission> Permissions { get; set; }
DbSet<RelationCompanyWell> RelationCompaniesWells { get; set; }
DbSet<RelationUserDrillingProgramPart> RelationDrillingProgramPartUsers { get; set; }
DbSet<RelationUserRolePermission> RelationUserRolePermissions { 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; } 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();
int SaveChanges(bool acceptAllChangesOnSuccess); int SaveChanges(bool acceptAllChangesOnSuccess);
Task<int> SaveChangesAsync(CancellationToken cancellationToken); Task<int> SaveChangesAsync(CancellationToken cancellationToken);
DbSet<TEntity> Set<TEntity>(string name) where TEntity : class; DbSet<TEntity> Set<TEntity>(string name) where TEntity : class;
DbSet<TEntity> Set<TEntity>() where TEntity : class; DbSet<TEntity> Set<TEntity>() where TEntity : class;
} }

View File

@ -5,6 +5,7 @@ using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services; using AsbCloudInfrastructure.Services;
using AsbCloudInfrastructure.Services.Analysis; using AsbCloudInfrastructure.Services.Analysis;
using AsbCloudInfrastructure.Services.Cache; using AsbCloudInfrastructure.Services.Cache;
using AsbCloudInfrastructure.Services.DailyReport;
using AsbCloudInfrastructure.Services.DrillingProgram; using AsbCloudInfrastructure.Services.DrillingProgram;
using AsbCloudInfrastructure.Services.SAUB; using AsbCloudInfrastructure.Services.SAUB;
using AsbCloudInfrastructure.Services.WellOperationService; using AsbCloudInfrastructure.Services.WellOperationService;
@ -85,6 +86,7 @@ namespace AsbCloudInfrastructure
services.AddTransient<IWellOperationImportService, WellOperationImportService>(); services.AddTransient<IWellOperationImportService, WellOperationImportService>();
services.AddTransient<IWellOperationService, WellOperationService>(); services.AddTransient<IWellOperationService, WellOperationService>();
services.AddTransient<IScheduleReportService, ScheduleReportService>(); services.AddTransient<IScheduleReportService, ScheduleReportService>();
services.AddTransient<IDailyReportService, DailyReportService>();
// admin crud services: // admin crud services:
services.AddTransient<ICrudService<TelemetryDto>, CrudServiceBase<TelemetryDto, Telemetry>>(); // может быть включен в сервис TelemetryService services.AddTransient<ICrudService<TelemetryDto>, CrudServiceBase<TelemetryDto, Telemetry>>(); // может быть включен в сервис TelemetryService

View File

@ -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;
}
}
}

View File

@ -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
}

View File

@ -4,9 +4,9 @@ using Microsoft.AspNetCore.Mvc;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Services;
namespace AsbCloudWebApi.Controllers namespace AsbCloudWebApi.Controllers
{ {
@ -15,6 +15,15 @@ namespace AsbCloudWebApi.Controllers
[Authorize] [Authorize]
public class DailyReportController : ControllerBase 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>
/// Список наборов данных для формирования рапорта /// Список наборов данных для формирования рапорта
/// </summary> /// </summary>
@ -28,12 +37,7 @@ namespace AsbCloudWebApi.Controllers
[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, DateTime? begin = null, DateTime? end = null, CancellationToken token = default)
{ {
await Task.Delay(1); var result = await dailyReportService.GetListAsync(idWell, begin, end, token);
var dto = new DailyReportDto
{
};
var result = new List<DailyReportDto> { dto };
return Ok(result); return Ok(result);
} }
@ -49,11 +53,7 @@ namespace AsbCloudWebApi.Controllers
[ProducesResponseType(typeof(DailyReportDto), (int)System.Net.HttpStatusCode.OK)] [ProducesResponseType(typeof(DailyReportDto), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> GetOrGenerateAsync(int idWell, [Required] DateTime date, CancellationToken token = default) public async Task<IActionResult> GetOrGenerateAsync(int idWell, [Required] DateTime date, CancellationToken token = default)
{ {
await Task.Delay(1); var dto = await dailyReportService.GetOrGenerateAsync(idWell, date, token);
var dto = new DailyReportDto
{
ReportDate = date,
};
return Ok(dto); return Ok(dto);
} }
@ -67,10 +67,10 @@ namespace AsbCloudWebApi.Controllers
[HttpPost] [HttpPost]
//[Permission] //[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] DailyReportDto dto, CancellationToken token = default) public async Task<IActionResult> AddAsync(int idWell, [Required][FromBody] DailyReportDto dto, CancellationToken token = default)
{ {
await Task.Delay(1); var result = await dailyReportService.AddAsync(idWell, dto, token);
return Ok(1); return Ok(result);
} }
/// <summary> /// <summary>
@ -86,8 +86,8 @@ namespace AsbCloudWebApi.Controllers
[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 async Task<IActionResult> UpdateAsync(int idWell, [Required] DateTime date, [Required] DailyReportDto dto, CancellationToken token = default)
{ {
await Task.Delay(1); var result = await dailyReportService.UpdateAsync(idWell, date, dto, token);
return Ok(1); return Ok(result);
} }
/// <summary> /// <summary>
@ -99,19 +99,16 @@ namespace AsbCloudWebApi.Controllers
[HttpGet("{date}/excel")] [HttpGet("{date}/excel")]
//[Permission] //[Permission]
[ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] [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 = await dailyReportService.MakeReportAsync(idWell, date, token);
var stream = GetExcelTemplateStream(); if (stream != null)
var fileName = "CP.xlsx"; {
return File(stream, "application/octet-stream", fileName); var fileName = "CP.xlsx";
} return File(stream, "application/octet-stream", fileName);
}
private static Stream GetExcelTemplateStream() else
{ return NoContent();
var assembly = System.Reflection.Assembly.GetAssembly(typeof(AsbCloudInfrastructure.IInfrastructureMarker));
var stream = assembly.GetManifestResourceStream("AsbCloudInfrastructure.Services.DailyReport.DailyReportTemplate.xlsx");
return stream;
} }
} }
} }

View File

@ -1,4 +1,5 @@
using System; using AsbCloudInfrastructure.Services.DailyReport;
using System;
namespace ConsoleApp1 namespace ConsoleApp1
{ {
@ -8,7 +9,20 @@ namespace ConsoleApp1
static void Main(/*string[] args*/) static void Main(/*string[] args*/)
{ {
// use ServiceFactory to make services // 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.WriteLine("End of Test");
Console.ReadLine(); Console.ReadLine();