DD.WellWorkover.Cloud/AsbCloudWebApi/Controllers/ReportController.cs
2024-08-19 10:01:07 +05:00

159 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudWebApi.SignalR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Requests;
using AsbCloudWebApi.SignalR.Clients;
namespace AsbCloudWebApi.Controllers;
/// <summary>
/// Отчет (временная диаграмма с сообщениями)
/// </summary>
[Route("api/well/{idWell}/report")]
[ApiController]
public class ReportController : ControllerBase
{
private readonly IReportService reportService;
private readonly IWellService wellService;
private readonly IHubContext<ReportsHub, IReportHubClient> reportsHubContext;
public ReportController(
IReportService reportService,
IWellService wellService,
IHubContext<ReportsHub,
IReportHubClient> reportsHubContext)
{
this.reportService = reportService;
this.wellService = wellService;
this.reportsHubContext = reportsHubContext;
}
/// <summary>
/// Создает отчет по скважине с указанными параметрами
/// </summary>
/// <param name="idWell">Id скважины</param>
/// <param name="request">Параметры запроса</param>
/// <param name="token">Токен для отмены задачи</param>
/// <returns>id фоновой задачи формирования отчета</returns>
[HttpPost]
[Permission]
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> CreateReportAsync([Required] int idWell,
[FromQuery] ReportParametersRequest request,
CancellationToken token)
{
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(async() =>
{
await reportsHubContext.Clients.Group($"Report_{id}")
.GetReportProgress(progress, token);
}, token);
var id = reportService.EnqueueCreateReportWork(idWell, (int)idUser, request, HandleReportProgressAsync);
return Ok(id);
}
/// <summary>
/// Возвращает имена всех отчетов по скважине
/// </summary>
/// <param name="idWell">id скважины</param>
/// <param name="token">Токен для отмены задачи</param>
/// <returns>Список имен существующих отчетов (отчетов)</returns>
[HttpGet]
[Permission]
[ProducesResponseType(typeof(IEnumerable<string>), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> GetAllReportsNamesByWellAsync(int idWell, CancellationToken token)
{
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);
}
/// <summary>
/// Возвращает прогнозируемое количество страниц будущего отчета
/// </summary>
/// <param name="idWell">Id скважины</param>
/// <param name="request">Параметры запроса</param>
/// <param name="token">Токен для отмены задачи</param>
/// <returns>прогнозируемое кол-во страниц отчета</returns>
[HttpGet("reportSize")]
[Permission]
[ProducesResponseType(typeof(string), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> GetReportSizeAsync([Required] int idWell,
[FromQuery] ReportParametersRequest request,
CancellationToken token)
{
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,
request.Begin, request.End, request.StepSeconds, request.Format);
return Ok(reportSize);
}
/// <summary>
/// Возвращает даты самого старого и самого свежего отчетов в БД
/// </summary>
/// <param name="idWell">id скважины</param>
/// <param name="token">Токен для отмены задачи</param>
/// <returns>Даты самого старого и самого свежего отчетов в БД</returns>
[HttpGet("datesRange")]
[Permission]
[ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)]
[ProducesResponseType((int)System.Net.HttpStatusCode.NoContent)]
public async Task<IActionResult> GetReportsDateRangeAsync(int idWell, CancellationToken token)
{
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);
if (wellReportsDatesRange is null)
return NoContent();
if (wellReportsDatesRange.From == wellReportsDatesRange.To)
return NoContent();
return Ok(wellReportsDatesRange);
}
}