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