using FastReport.Export.OoXML; using FastReport.Export.Pdf; using Myshipping.Report.Models; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; using Myshipping.Report.DB; using Myshipping.Application.Entity; using System.Text; namespace Myshipping.Report.Controllers { public class ReportController : Controller { private readonly NLog.Logger log = NLog.LogManager.GetCurrentClassLogger(); private SqlSugar.SqlSugarClient sqlSugarClient; public ReportController() { sqlSugarClient = new SqlSugar.SqlSugarClient(new BookingConnectionConfig()); } /// /// 生成订舱报表结果 /// /// 订舱ID /// 类型,1:pdf、2:xlsx /// [HttpPost] public ActionResult BookingReport(long bookingId, int type = 1) { var resp = new RespCommonData(); if (Request.Files.Count > 0) { var savePath = ConfigurationManager.AppSettings["ReportFileSavePath"]; if (string.IsNullOrEmpty(savePath)) //未配置保存路径时,使用当前目录 { savePath = Server.MapPath("~/ReportFiles"); } if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } var fileExt = Path.GetExtension(Request.Files[0].FileName).ToLower(); if (fileExt != ".frx") { resp.Success = false; resp.Message = $"文件类型不正确:{fileExt}"; return Json(resp); } var tmpFile = Path.Combine(savePath, $"{Guid.NewGuid()}{fileExt}"); Request.Files[0].SaveAs(tmpFile); log.Debug($"临时保存模板文件:{tmpFile}"); //生成报表 FastReport.Report report = new FastReport.Report(); report.Load(tmpFile); foreach (FastReport.Data.JsonConnection.JsonDataSourceConnection conn in report.Dictionary.Connections) { if (conn.Name == "booking_order") { conn.ConnectionString = $"Json={Convert.ToBase64String(Encoding.UTF8.GetBytes(GetBookingJson(bookingId)))};Encoding=utf-8"; } } report.Prepare(); if (type == 1) //pdf { var fileName = $"{bookingId}_{DateTime.Now.Ticks}.pdf"; var saveFile = Path.Combine(savePath, fileName); PDFExport pdfExport = new PDFExport(); pdfExport.Export(report, saveFile); resp.Success = true; resp.Message = "生成成功"; resp.Data = fileName; } else if (type == 2) // { var fileName = $"{bookingId}_{DateTime.Now.Ticks}.xlsx"; var saveFile = Path.Combine(savePath, fileName); Excel2007Export excelExport = new Excel2007Export(); excelExport.Export(report, saveFile); resp.Success = true; resp.Message = "生成成功"; resp.Data = fileName; } else { resp.Success = false; resp.Message = "类型参数不正确"; } return Json(resp); } else { resp.Success = false; resp.Message = "未上传模板文件"; } return Json(resp); } /// /// 根据文件名获取文件 /// /// /// [HttpGet] public ActionResult GetFile(string fileName) { var basePath = ConfigurationManager.AppSettings["ReportFileSavePath"]; if (string.IsNullOrEmpty(basePath)) //未配置保存路径时,使用当前目录 { basePath = Server.MapPath("~/ReportFiles"); } var saveFile = Path.Combine(basePath, fileName); if (System.IO.File.Exists(saveFile)) { return File(saveFile, "application/octet-stream", HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"))); } return HttpNotFound(); } [HttpGet] public ActionResult BookingReportJson(long bookingId) { log.Debug("test"); return Content(GetBookingJson(bookingId)); } [NonAction] private string GetBookingJson(long bookingId) { log.Debug($"准备获取订舱数据:{bookingId}"); var order = sqlSugarClient.Queryable().First(x => x.Id == bookingId); var ctns = sqlSugarClient.Queryable().Where(x => x.BILLID == bookingId).ToList(); var strObj = JsonConvert.SerializeObject(new { order = order, ctns = ctns }); log.Debug($"订舱数据:{strObj}"); return strObj; } } }