From b1568820d3df9f67bcb4501eaa68897783e47912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 3 Nov 2023 19:26:41 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B9=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D1=82=D1=87?= =?UTF-8?q?=D1=91=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IDailyReportRepository.cs | 42 +++++++ .../Repository/DailyReportRepository.cs | 103 ++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 AsbCloudApp/Repositories/IDailyReportRepository.cs create mode 100644 AsbCloudInfrastructure/Repository/DailyReportRepository.cs diff --git a/AsbCloudApp/Repositories/IDailyReportRepository.cs b/AsbCloudApp/Repositories/IDailyReportRepository.cs new file mode 100644 index 00000000..e9a20d2c --- /dev/null +++ b/AsbCloudApp/Repositories/IDailyReportRepository.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.DailyReport; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; + +namespace AsbCloudApp.Repositories; + +/// +/// Суточные отчёты +/// +public interface IDailyReportRepository : ICrudRepository +{ + /// + /// Получить список суточный отчёт по скважине + /// + /// + /// + /// + /// + Task> GetAsync(int idWell, FileReportRequest request, CancellationToken cancellationToken); + + /// + /// Получить суточный отчёт + /// + /// + /// + /// + /// + Task GetOrDefaultAsync(int idWell, DateTime dateStart, CancellationToken cancellationToken); + + /// + /// Проверка существование суточного отчёта + /// + /// + /// + /// + /// + Task AnyAsync(int idWell, DateTime dateStart, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs new file mode 100644 index 00000000..d67dd302 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.DailyReport; +using AsbCloudApp.Data.DailyReport.Blocks.Sign; +using AsbCloudApp.Data.DailyReport.Blocks.Subsystems; +using AsbCloudApp.Data.DailyReport.Blocks.TimeBalance; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudDb; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; + +namespace AsbCloudInfrastructure.Repository; + +public class DailyReportRepository : CrudRepositoryBase, + IDailyReportRepository +{ + private class Blocks + { + public SubsystemBlockDto? Subsystem { get; set; } + + public TimeBalanceBlockDto? TimeBalance { get; set; } + + public SignBlockDto? Sign { get; set; } + } + + public DailyReportRepository(IAsbCloudDbContext dbContext) + : base(dbContext) + { + } + + public async Task> GetAsync(int idWell, FileReportRequest request, CancellationToken cancellationToken) + { + var skip = request.Skip ?? 0; + var take = request.Take ?? 10; + + var query = GetQuery().Where(d => d.IdWell == idWell); + + if (request.GeDate.HasValue) + query = query.Where(d => d.DateStart <= request.GeDate.Value.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc)); + + if (request.LeDate.HasValue) + query = query.Where(d => d.DateStart >= request.LeDate.Value.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc)); + + if (request.SortFields?.Any() == true) + { + query = query.SortBy(request.SortFields); + } + + var entities = await query + .AsNoTracking() + .ToArrayAsync(cancellationToken); + + return entities.Skip(skip).Take(take).Select(Convert); + } + + public async Task GetOrDefaultAsync(int idWell, DateTime dateStart, CancellationToken cancellationToken) + { + var entity = await GetQuery() + .Include(d => d.Well) + .SingleOrDefaultAsync(d => d.IdWell == idWell && + d.DateStart == dateStart, cancellationToken); + + return entity is null ? null : Convert(entity); + } + + public Task AnyAsync(int idWell, DateTime dateStart, CancellationToken cancellationToken) => + GetQuery().AnyAsync(d => d.IdWell == idWell && d.DateStart == dateStart, cancellationToken); + + protected override DailyReport Convert(DailyReportDto src) + { + var entity = base.Convert(src); + + entity.Blocks = JsonSerializer.Serialize(new Blocks + { + Subsystem = src.SubsystemBlock, + TimeBalance = src.TimeBalanceBlock, + Sign = src.SignBlock, + }); + + return entity; + } + + protected override DailyReportDto Convert(DailyReport src) + { + var dto = base.Convert(src); + + if (string.IsNullOrWhiteSpace(src.Blocks)) + return dto; + + var blocks = JsonSerializer.Deserialize(src.Blocks); + + dto.SubsystemBlock = blocks?.Subsystem; + dto.TimeBalanceBlock = blocks?.TimeBalance; + dto.SignBlock = blocks?.Sign; + + return dto; + } +} \ No newline at end of file