Files
YunTongJackYunTask/Reportapi/MyCode.Project.WebApi/Areas/Admin/Controllers/LxmZHMDReportController.cs

189 lines
5.9 KiB
C#
Raw Normal View History

2025-07-04 09:50:02 +08:00
using MyCode.Project.Domain.Message.Act.Common;
2025-07-04 10:47:18 +08:00
using MyCode.Project.Infrastructure.Cache;
2025-07-04 09:50:02 +08:00
using MyCode.Project.Infrastructure.Common;
2025-07-04 10:47:18 +08:00
using MyCode.Project.Infrastructure.Constant;
using MyCode.Project.Infrastructure.Enumeration;
2025-07-04 09:50:02 +08:00
using MyCode.Project.Infrastructure.Exceptions;
2025-07-04 10:47:18 +08:00
using MyCode.Project.Services;
2025-07-04 09:50:02 +08:00
using MyCode.Project.WebApi.App_Filter;
using System;
using System.IO;
using System.Web.Http;
namespace MyCode.Project.WebApi.Areas.Admin.Controllers
{
/// <summary>
2025-07-07 13:54:21 +08:00
///
2025-07-04 09:50:02 +08:00
/// </summary>
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()
/// <summary>
/// 测试方法
/// </summary>
[AllowAnonymous]
[HttpGet]
public string Test()
{
return "test";
}
#endregion
#region ExportXls()
/// <summary>
/// 导出报表,得到报表id根据该ID可以建立websocket与下载
/// </summary>
/// <returns></returns>
[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导出)
2025-07-04 10:47:18 +08:00
2025-07-04 09:50:02 +08:00
#endregion
#region ZIP导出()
2025-07-04 10:47:18 +08:00
2025-07-04 09:50:02 +08:00
#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
/// <summary>
/// 压缩文件导出处理
/// </summary>
/// <param name="act"></param>
/// <returns></returns>
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<IReportService>("ReportExportAnsy", DateTime.Now.AddHours(1), act);
return act.ReportId;
}
#region CancelExport()
/// <summary>
/// 取消导出
/// </summary>
/// <param name="act"></param>
[AllowAnonymous]
[HttpPost]
public void CancelExport(IdAct act)
{
_myCodeCacheServie.Delete($"{CacheKey.ReportZipFileCacheKey}{act.Id}");
_myCodeCacheServie.Delete($"{CacheKey.HasDownloadZipCacheKey}");
}
#endregion
#region DownLoadExcel()
/// <summary>
/// 开始下载
/// </summary>
/// <returns></returns>
[AllowAnonymous]
[IgnoreResultHandle]
[HttpGet]
public void DownLoadExcel(long id)
{
var res = CurrentHttpContext;
var zipFile = _myCodeCacheServie.Get<string>($"{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
}
}