using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.Reporting.NETCore; using NLog; using System.Data; using WebDoorCreator.Core.ReportViewer; using WebDoorCreator.Data.Services; namespace WebDoorCreator.API.Controllers { [Route("api/[controller]")] [ApiController] public class ReportController : ControllerBase { #region Public Constructors public ReportController(IConfiguration configuration, QueueDataService DataService) { Log.Info("Starting ReportController"); _configuration = configuration; QDataServ = DataService; Log.Info("Avviato ReportController"); } #endregion Public Constructors #region Public Methods // GET: api/Alive [HttpGet] public string Get() { return "OK"; } /// /// Restituisce report dato ordine e formato /// /// ID univoco ordine /// Formato: PDF/HTML/DOCX/XLSX /// [HttpGet("GetOrderReport")] public async Task GetOrderReport(int OrderId, string Format) { await Task.Delay(1); string FileName = $"DCA-Order-{OrderId:00000000}"; string Extension = ""; string MimeType = ""; switch (Format.ToUpper()) { case "HTML": Extension = "html"; MimeType = "text/html"; break; case "DOCX": Extension = "docx"; MimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; break; case "XLSX": Extension = "xlsx"; MimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; break; case "PDF": default: Extension = "pdf"; MimeType = "application/pdf"; break; } // restituisco oggetto return OrderReportGet(FileName, Format, Extension, MimeType); } #endregion Public Methods #region Private Fields private static IConfiguration _configuration = null!; private static Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields #region Private Properties private QueueDataService QDataServ { get; set; } = null!; #endregion Private Properties #region Private Methods /// /// Restituisce filestream del report richiesto /// /// Nome file desiderato x download /// /// /// /// private IActionResult OrderReportGet(string FileName, string renderFormat, string extension, string mimeType) { using (var report = new LocalReport()) { // setup parametri List RepParams = new List(); RepParams.Add(new ReportParameter("Title", "Invoice 4/2020")); // setup DsReport Dictionary DsDict = new Dictionary(); Random rnd = new Random(); decimal WidgetPrice = 204.99m; decimal GizmoPrice = 2.41m; ReportItem[] items = new[] { new ReportItem { Description = "Widget 6000", Price = WidgetPrice, Qty = rnd.Next(1,5) }, new ReportItem { Description = "Gizmo MAX", Price = GizmoPrice, Qty = rnd.Next(10,50) }, new ReportItem { Description = "Pippo", Price = 1.2m, Qty = rnd.Next(3,9) }, new ReportItem { Description = "Paperino", Price = 1.74m, Qty = rnd.Next(5,15) } }; DataTable tabDati = new DataTable("Items"); //tabDati = items.ToDataTable(); tabDati.Columns.Add("Description", typeof(string)); tabDati.Columns.Add("Price", typeof(decimal)); tabDati.Columns.Add("Qty", typeof(int)); tabDati.Columns.Add("Total", typeof(decimal)); DataRow newRow = tabDati.NewRow(); foreach (var item in items) { newRow = tabDati.NewRow(); newRow["Description"] = item.Description; newRow["Price"] = item.Price; newRow["Qty"] = item.Qty; newRow["Total"] = item.Price*item.Qty; // Add the row to the rows collection. tabDati.Rows.Add(newRow); } // aggiungo dizionario DsDict.Add("Items", tabDati); // carico dati nel report... Core.ReportViewer.Report.Load(report, "Report.rdlc", RepParams, DsDict); var rawData = report.Render(renderFormat); return File(rawData, mimeType, $"{FileName}.{extension}"); } } #endregion Private Methods } }