144 lines
5.0 KiB
C#
144 lines
5.0 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using GreenHome.Application;
|
|
|
|
namespace GreenHome.Api.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("api/[controller]")]
|
|
public class DailyReportController : ControllerBase
|
|
{
|
|
private readonly IDailyReportService _dailyReportService;
|
|
private readonly ILogger<DailyReportController> _logger;
|
|
|
|
public DailyReportController(
|
|
IDailyReportService dailyReportService,
|
|
ILogger<DailyReportController> logger)
|
|
{
|
|
_dailyReportService = dailyReportService;
|
|
_logger = logger;
|
|
}
|
|
|
|
/// <summary>
|
|
/// دریافت یا ایجاد گزارش تحلیل روزانه گلخانه
|
|
/// </summary>
|
|
/// <param name="deviceId">شناسه دستگاه</param>
|
|
/// <param name="persianDate">تاریخ شمسی به فرمت yyyy/MM/dd</param>
|
|
/// <param name="cancellationToken">Cancellation token</param>
|
|
/// <returns>گزارش تحلیل روزانه</returns>
|
|
[HttpGet]
|
|
public async Task<ActionResult<DailyReportResponse>> GetDailyReport(
|
|
[FromQuery] int deviceId,
|
|
[FromQuery] string persianDate,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
try
|
|
{
|
|
if (deviceId <= 0)
|
|
{
|
|
return BadRequest(new { error = "شناسه دستگاه نامعتبر است" });
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(persianDate))
|
|
{
|
|
return BadRequest(new { error = "تاریخ نباید خالی باشد" });
|
|
}
|
|
|
|
var request = new DailyReportRequest
|
|
{
|
|
DeviceId = deviceId,
|
|
PersianDate = persianDate.Trim()
|
|
};
|
|
|
|
var result = await _dailyReportService.GetOrCreateDailyReportAsync(request, cancellationToken);
|
|
|
|
_logger.LogInformation(
|
|
"گزارش روزانه برای دستگاه {DeviceId} و تاریخ {Date} با موفقیت برگشت داده شد (FromCache: {FromCache})",
|
|
deviceId, persianDate, result.FromCache);
|
|
|
|
return Ok(result);
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
_logger.LogWarning(ex, "درخواست نامعتبر برای دستگاه {DeviceId} و تاریخ {Date}", deviceId, persianDate);
|
|
return BadRequest(new { error = ex.Message });
|
|
}
|
|
catch (InvalidOperationException ex)
|
|
{
|
|
_logger.LogWarning(ex, "خطا در پردازش گزارش روزانه برای دستگاه {DeviceId} و تاریخ {Date}", deviceId, persianDate);
|
|
return NotFound(new { error = ex.Message });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "خطای سرور در دریافت گزارش روزانه برای دستگاه {DeviceId} و تاریخ {Date}", deviceId, persianDate);
|
|
return StatusCode(500, new { error = "خطای سرور در پردازش درخواست" });
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// دریافت تحلیل هفتگی
|
|
/// </summary>
|
|
[HttpGet("weekly")]
|
|
public async Task<ActionResult<DailyReportResponse>> GetWeeklyAnalysis(
|
|
[FromQuery] int deviceId,
|
|
[FromQuery] string startDate,
|
|
[FromQuery] string endDate,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
try
|
|
{
|
|
var request = new WeeklyAnalysisRequest
|
|
{
|
|
DeviceId = deviceId,
|
|
StartDate = startDate.Trim(),
|
|
EndDate = endDate.Trim()
|
|
};
|
|
|
|
var result = await _dailyReportService.GetWeeklyAnalysisAsync(request, cancellationToken);
|
|
return Ok(result);
|
|
}
|
|
catch (InvalidOperationException ex)
|
|
{
|
|
return BadRequest(new { error = ex.Message });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "Error getting weekly analysis");
|
|
return StatusCode(500, new { error = "خطا در دریافت تحلیل هفتگی" });
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// دریافت تحلیل ماهانه
|
|
/// </summary>
|
|
[HttpGet("monthly")]
|
|
public async Task<ActionResult<DailyReportResponse>> GetMonthlyAnalysis(
|
|
[FromQuery] int deviceId,
|
|
[FromQuery] int year,
|
|
[FromQuery] int month,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
try
|
|
{
|
|
var request = new MonthlyAnalysisRequest
|
|
{
|
|
DeviceId = deviceId,
|
|
Year = year,
|
|
Month = month
|
|
};
|
|
|
|
var result = await _dailyReportService.GetMonthlyAnalysisAsync(request, cancellationToken);
|
|
return Ok(result);
|
|
}
|
|
catch (InvalidOperationException ex)
|
|
{
|
|
return BadRequest(new { error = ex.Message });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "Error getting monthly analysis");
|
|
return StatusCode(500, new { error = "خطا در دریافت تحلیل ماهانه" });
|
|
}
|
|
}
|
|
}
|
|
|