using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudWebApi.SignalR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers { /// /// Отчет (временная диаграмма с сообщениями) /// [Route("api/well/{idWell}/report")] [ApiController] public class ReportController : ControllerBase { private readonly IReportService reportService; private readonly FileService fileService; private readonly IWellService wellService; private readonly IHubContext reportsHubContext; public ReportController(IReportService reportService, IWellService wellService, FileService fileService, IHubContext reportsHubContext) { this.reportService = reportService; this.fileService = fileService; this.wellService = wellService; this.reportsHubContext = reportsHubContext; } /// /// Создает отчет по скважине с указанными параметрами /// /// id скважины /// шаг интервала /// формат отчета (0-PDF, 1-LAS) /// дата начала интервала /// дата окончания интервала /// Токен для отмены задачи /// id фоновой задачи формирования отчета [HttpPost] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task CreateReportAsync(int idWell, int stepSeconds, int format, DateTime begin = default, DateTime end = default, CancellationToken token = default) { var idCompany = User.GetCompanyId(); var idUser = User.GetUserId(); if ((idCompany is null) || (idUser is null)) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); void HandleReportProgressAsync(object progress, string id) => Task.Run(() => { reportsHubContext.Clients.Group($"Report_{id}").SendAsync( nameof(IReportHubClient.GetReportProgress), progress, token ).ConfigureAwait(false); }, token); var id = reportService.CreateReport(idWell, (int)idUser, stepSeconds, format, begin, end, HandleReportProgressAsync); return Ok(id); } /// /// Возвращает имена всех отчетов по скважине /// /// id скважины /// Токен для отмены задачи /// Список имен существующих отчетов (отчетов) [HttpGet] [Permission] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetAllReportsNamesByWellAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var reports = await reportService.GetAllReportsByWellAsync(idWell, token).ConfigureAwait(false); return Ok(reports); } /// /// Возвращает прогнозируемое количество страниц будущего отчета /// /// id скважины /// дата начала интервала /// дата окончания интервала /// шаг интервала /// формат отчета (0-PDF, 1-LAS) /// Токен для отмены задачи /// прогнозируемое кол-во страниц отчета [HttpGet] [Route("reportSize")] [Permission] [ProducesResponseType(typeof(string), (int)System.Net.HttpStatusCode.OK)] public async Task GetReportSizeAsync(int idWell, int stepSeconds, int format, DateTime begin = default, DateTime end = default, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); int reportSize = reportService.GetReportPagesCount(idWell, begin, end, stepSeconds, format); return Ok(reportSize); } /// /// Возвращает даты самого старого и самого свежего отчетов в БД /// /// id скважины /// Токен для отмены задачи /// Даты самого старого и самого свежего отчетов в БД [HttpGet] [Route("datesRange")] [Permission] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetReportsDateRangeAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token).ConfigureAwait(false)) return Forbid(); var wellReportsDatesRange = reportService.GetDatesRangeOrDefault(idWell); return Ok(wellReportsDatesRange); } } }