using MyCode.Project.Domain.Message.Act.Common;
using MyCode.Project.Infrastructure.Cache;
using MyCode.Project.Infrastructure.Common;
using MyCode.Project.Infrastructure.Constant;
using MyCode.Project.Infrastructure.Enumeration;
using MyCode.Project.Infrastructure.Exceptions;
using MyCode.Project.Services;
using MyCode.Project.WebApi.App_Filter;
using System;
using System.IO;
using System.Web.Http;
namespace MyCode.Project.WebApi.Areas.Admin.Controllers
{
///
/// 导出功能
///
public class LxmZHMDReportController : BaseAdminController
{
#region 初始化
private readonly IReportService _reportService;
private readonly IMyCodeCacheService _myCodeCacheServie;
private readonly IQueueProcessService _queueProcessService;
public LxmZHMDReportController(IReportService reportService,
IMyCodeCacheService myCodeCacheService,
IQueueProcessService queueProcessService
)
{
_reportService = reportService;
_myCodeCacheServie = myCodeCacheService;
_queueProcessService = queueProcessService;
}
#endregion
#region Test(测试方法)
///
/// 测试方法
///
[AllowAnonymous]
[HttpGet]
public string Test()
{
return "test";
}
#endregion
#region ExportXls(导出报表)
///
/// 导出报表,得到报表id,根据该ID可以建立websocket与下载
///
///
[HttpPost]
public dynamic ExportXls(ReportExportAct act)
{
var reportId = IdHelper.GetNewId();
var ansyAct = new AnsyReportExportAct()
{
Condition = act.Condition,
CurrentUser = CurrentLogin,
ReportId = reportId,
ReportType = act.ReportType
};
//ZIP导出
#region ZIP导出(没有特殊处理的方法,不包含旧的ZIP导出)
#endregion
#region ZIP导出(单独写的方法后续不动)
#endregion
ansyAct.ExportFileType = (int)ExportFileType.Xls;
//正常的导出
var filePath = _reportService.ReportExport(ansyAct);
var fileName = Path.GetFileName(filePath);
var res = CurrentHttpContext;
res.Response.Clear();
using (var fs = new FileStream(filePath, FileMode.Open))
{
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);//将流
res.Response.AppendHeader("Content-Disposition", $"attachment;filename={fileName};size={bytes.Length}");
res.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=GB2312";
res.Response.BinaryWrite(bytes);
res.Response.Flush();
res.Response.End();
}
return reportId;
}
#endregion
///
/// 压缩文件导出处理
///
///
///
public long ZIPExportXls(AnsyReportExportAct act)
{
string hasDownloadZipCacheKey = CacheKey.HasDownloadZipCacheKey + $@":{act.ReportType}";
var existDowing = _myCodeCacheServie.Exists(hasDownloadZipCacheKey);
if (existDowing) { throw new BaseException("当前有人正在导出该报表,为了保障性能,请1分钟后再导出"); }
//下载的标识
_myCodeCacheServie.Set($"{hasDownloadZipCacheKey}", 1, new TimeSpan(0, 1, 0));
//有这个才需要继续执行导出,没有的话,说明是去消息了
_myCodeCacheServie.Set($"{CacheKey.ReportZipFileCacheKey}{act.ReportId}", "", new TimeSpan(1, 0, 0));
_queueProcessService.AddQueue("ReportExportAnsy", DateTime.Now.AddHours(1), act);
return act.ReportId;
}
#region CancelExport(取消导出)
///
/// 取消导出
///
///
[AllowAnonymous]
[HttpPost]
public void CancelExport(IdAct act)
{
_myCodeCacheServie.Delete($"{CacheKey.ReportZipFileCacheKey}{act.Id}");
_myCodeCacheServie.Delete($"{CacheKey.HasDownloadZipCacheKey}");
}
#endregion
#region DownLoadExcel(开始下载)
///
/// 开始下载
///
///
[AllowAnonymous]
[IgnoreResultHandle]
[HttpGet]
public void DownLoadExcel(long id)
{
var res = CurrentHttpContext;
var zipFile = _myCodeCacheServie.Get($"{CacheKey.ReportZipFileCacheKey}{id}");
if (string.IsNullOrWhiteSpace(zipFile)) { throw new BaseException("没有需要下载的文件"); }
//var zipFile = @"D:\App_File\download\exceltemp\202301\2301291545561350.zip";
//得到文件名
var fileName = Path.GetFileName(zipFile);
res.Response.Clear();
res.Response.Buffer = false;
using (var fs = new FileStream(zipFile, FileMode.Open))
{
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);//将流
res.Response.AppendHeader("Content-Disposition", $"attachment;filename={fileName};size={bytes.Length}");
res.Response.ContentType = "application/x-zip-compressed;charset=UTF-8";//输出流的MIME类型
res.Response.BinaryWrite(bytes);
res.Response.Flush();
res.Response.End();
}
}
#endregion
}
}