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;
}
}
}