DD.WellWorkover.Cloud/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs

229 lines
9.3 KiB
C#
Raw Normal View History

using System;
2022-05-05 10:06:15 +05:00
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;
using AsbCloudApp.Data.DailyReportModel;
namespace AsbCloudInfrastructure.Services.DailyReport
{
2022-05-05 10:06:15 +05:00
#nullable enable
public class DailyReportService : IDailyReportService
{
private readonly IAsbCloudDbContext db;
private readonly IWellService wellService;
2022-05-05 10:06:15 +05:00
private readonly DailyReportMakerExcel dailyReportMaker = new DailyReportMakerExcel();
public DailyReportService(IAsbCloudDbContext db, IWellService wellService)
{
this.db = db;
this.wellService = wellService;
}
2022-05-05 10:06:15 +05:00
public async Task<IEnumerable<DailyReportDto>> GetListAsync(int idWell, DateTime? begin, DateTime? end, CancellationToken token)
2022-06-15 14:57:37 +05:00
{
2022-05-05 10:06:15 +05:00
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);
}
2022-06-15 14:57:37 +05:00
2022-05-05 10:06:15 +05:00
var entities = await query
.ToListAsync(token);
return entities.Select(r => Convert(r, offsetHours));
}
2022-05-05 10:06:15 +05:00
public async Task<DailyReportDto> GetOrGenerateAsync(int idWell, DateTime date, CancellationToken token)
{
2022-05-05 10:06:15 +05:00
var dailyReportDto = await GetAsync(idWell, date, token);
if (dailyReportDto is null)
return await MakeDefaultDailyReportAsync(idWell, date, token);
2022-05-05 10:06:15 +05:00
else
return dailyReportDto;
}
2022-05-05 10:06:15 +05:00
public async Task<int> AddAsync(int idWell, DailyReportDto dto, CancellationToken token = default)
{
2022-05-05 10:06:15 +05:00
var offsetHours = wellService.GetTimezone(idWell).Hours;
var reportDateOffset = dto.ReportDate.ToUtcDateTimeOffset(offsetHours);
var info = Convert(dto, offsetHours);
var entity = new AsbCloudDb.Model.DailyReport
{
2022-05-05 10:06:15 +05:00
IdWell = idWell,
StartDate = reportDateOffset,
Info = info,
};
2022-05-05 10:06:15 +05:00
db.DailyReports.Add(entity);
var result = await db.SaveChangesAsync(token);
return result;
}
2022-05-05 10:06:15 +05:00
public async Task<int> UpdateAsync(int idWell, DateTime date, DailyReportDto dto, CancellationToken token)
{
var offsetHours = wellService.GetTimezone(idWell).Hours;
2022-05-05 15:14:29 +05:00
var dateOffset = date.ToUtcDateTimeOffset(offsetHours);
2022-05-05 10:06:15 +05:00
var entity = await db.DailyReports
2022-05-05 15:14:29 +05:00
.FirstOrDefaultAsync(r => r.IdWell == idWell &&
r.StartDate.Year == dateOffset.Year &&
r.StartDate.DayOfYear == dateOffset.DayOfYear
, token);
2022-05-05 10:06:15 +05:00
if (entity is null)
return 0;
2022-05-05 10:06:15 +05:00
entity.Info = Convert(dto, offsetHours);
db.DailyReports.Update(entity);
2022-05-05 10:06:15 +05:00
var result = await db.SaveChangesAsync(token);
return result;
}
2022-05-05 10:06:15 +05:00
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;
}
2022-05-05 10:06:15 +05:00
private async Task<DailyReportDto?> GetAsync(int idWell, DateTime date, CancellationToken token)
{
var offsetHours = wellService.GetTimezone(idWell).Hours;
var dateOffset = date.ToUtcDateTimeOffset(offsetHours);
2022-05-05 15:14:29 +05:00
var entity = await db.DailyReports
.FirstOrDefaultAsync(r => r.IdWell == idWell &&
r.StartDate.Year == dateOffset.Year &&
r.StartDate.DayOfYear == dateOffset.DayOfYear
, token);
2022-05-05 15:14:29 +05:00
if (entity is null)
2022-05-05 10:06:15 +05:00
return null;
else
2022-05-05 15:14:29 +05:00
return Convert(entity, offsetHours);
}
private async Task<DailyReportDto> MakeDefaultDailyReportAsync(int idWell, DateTime date, CancellationToken token)
{
2022-05-05 10:06:15 +05:00
var well = await wellService.GetAsync(idWell, token);
var offsetHours = wellService.GetTimezone(idWell).Hours;
var dto = new DailyReportDto()
{
ReportDate = date,
2022-05-05 10:06:15 +05:00
WellName = well.Caption,
2022-06-15 14:57:37 +05:00
ClusterName = well.Cluster,
2022-05-05 10:06:15 +05:00
};
DailyReportDto result = dto;
return result;
}
2022-05-05 10:06:15 +05:00
private static DailyReportDto Convert(AsbCloudDb.Model.DailyReport entity, double offsetHours)
{
var dto = entity.Info.Adapt<DailyReportDto>();
2022-05-05 15:14:29 +05:00
dto.ReportDate = entity.StartDate
.ToRemoteDateTime(offsetHours);
2022-05-05 10:06:15 +05:00
return dto;
}
2022-05-05 10:06:15 +05:00
private static DailyReportInfo Convert(DailyReportDto dto, double offsetHours)
{
2022-06-15 14:57:37 +05:00
var entity = dto.Adapt<DailyReportInfo>();
2022-05-05 15:14:29 +05:00
entity.ReportDate = dto.ReportDate
.ToUtcDateTimeOffset(offsetHours)
.Date;
2022-05-05 10:06:15 +05:00
return entity;
}
// черновик реализации "по блокам"
public async Task<Stream?> MakeReportFromBlocksAsync(int idWell, DateTime date, CancellationToken token = default)
{
var dailyReportDto = await GetAsync(idWell, date, token);
if (dailyReportDto is null)
return null;
var block1 = new DailyReportHeadDto()
{
WellName = dailyReportDto.WellName,
ClusterName = dailyReportDto.ClusterName,
Customer = dailyReportDto.Customer,
Contractor = dailyReportDto.Contractor,
ReportDate = dailyReportDto.ReportDate,
WellDepthIntervalStartDate = dailyReportDto.WellDepthIntervalStartDate,
WellDepthIntervalFinishDate = dailyReportDto.WellDepthIntervalFinishDate,
BottomholeDepth = dailyReportDto.BottomholeDepth,
VerticalDepth = dailyReportDto.VerticalDepth,
ZenithAngle = dailyReportDto.ZenithAngle,
AzimuthAngle = dailyReportDto.AzimuthAngle,
FirstDriller = dailyReportDto.FirstDriller,
SecondDriller = dailyReportDto.SecondDriller,
WorkTimeSAUB = dailyReportDto.WorkTimeSAUB,
WorkTimeSpinMaster = dailyReportDto.WorkTimeSpinMaster,
WorkTimeTorkMaster = dailyReportDto.WorkTimeTorkMaster,
PenetrationSAUB = dailyReportDto.PenetrationSAUB,
PenetrationSpinMaster = dailyReportDto.PenetrationSpinMaster,
PenetrationTorkMaster = dailyReportDto.PenetrationTorkMaster,
CountLaunchesMSE = dailyReportDto.CountLaunchesMSE
};
var block2 = new DailyReportBhaDto()
{
BHADescription = dailyReportDto.BHADescription
};
var block4 = new DailyReportDimensionlessDto()
{
ActualTimeBarrelPreparation = dailyReportDto.ActualTimeBarrelPreparation,
ActualTimeExtension = dailyReportDto.ActualTimeExtension,
StandardTimeBarrelPreparation = dailyReportDto.StandardTimeBarrelPreparation,
StandardTimeExtension = dailyReportDto.StandardTimeExtension
};
var block5 = new DailyReportSaubDto()
{
AVGDiffDropRotor = dailyReportDto.AVGDiffDropRotor,
AVGDiffPressureSlide = dailyReportDto.AVGDiffPressureSlide,
DeclinesReasonsROP = dailyReportDto.DeclinesReasonsROP,
DeviationFromTVD = dailyReportDto.DeviationFromTVD,
DrillingTimeInRotor = dailyReportDto.DrillingTimeInRotor,
NumberDrillingHours = dailyReportDto.NumberDrillingHours,
ExtensionsCount = dailyReportDto.ExtensionsCount,
PenetrationInRotor = dailyReportDto.PenetrationInRotor,
PenetrationInSlide = dailyReportDto.PenetrationInSlide,
RotorDrillingModes = dailyReportDto.RotorDrillingModes,
SectionDrillingTimeTotal = dailyReportDto.SectionDrillingTimeTotal,
SectionPenetrationTotal = dailyReportDto.SectionPenetrationTotal,
SectionROPPlan = dailyReportDto.SectionROPPlan,
SlideDrillingModes = dailyReportDto.SlideDrillingModes
};
var block6 = new DailyReportSignDto()
{
DrillingMaster = dailyReportDto.DrillingMaster,
Supervisor = dailyReportDto.Supervisor
};
var memoryStream = dailyReportMaker.MakeReportFromBlocks(block1, block2, block4, block5, block6);
return memoryStream;
}
}
2022-05-05 10:06:15 +05:00
#nullable disable
}