diff --git a/server/Zr.Admin.NET/ZR.Admin.WebApi/Controllers/Business/CamWorkrecordController.cs b/server/Zr.Admin.NET/ZR.Admin.WebApi/Controllers/Business/CamWorkrecordController.cs index d720f71..9764839 100644 --- a/server/Zr.Admin.NET/ZR.Admin.WebApi/Controllers/Business/CamWorkrecordController.cs +++ b/server/Zr.Admin.NET/ZR.Admin.WebApi/Controllers/Business/CamWorkrecordController.cs @@ -171,12 +171,12 @@ namespace ZR.Admin.WebApi.Controllers.Business } /// - /// 导出工作记录 + /// 导出工作记录(异步生成,返回下载URL) /// /// [Log(Title = "工作记录", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)] [HttpGet("export")] - [ActionPermissionFilter(Permission = "camworkrecord:export")] + // [ActionPermissionFilter(Permission = "camworkrecord:export")] public IActionResult Export([FromQuery] CamWorkrecordQueryDto parm) { var list = _CamWorkrecordService.ExportList(parm).Result; @@ -207,7 +207,47 @@ namespace ZR.Admin.WebApi.Controllers.Business it.ImageUrl = temp; i++; }); - ExcelHelper excelHelper = new ExcelHelper(WebHostEnvironment); + ExcelPackage.License.SetNonCommercialPersonal("pnaa"); + var result = ExportWorkRecordExcel(list, imagesByRecordId, url, savePath, "工作记录", 100, 70, 60); + + // 返回下载URL,让浏览器直接下载,避免流传输卡死 + var downloadUrl = $"/export/{result.fileName}"; + return SUCCESS(new { url = downloadUrl, fileName = result.fileName }); + } + + /// + /// 导出工作记录(传统流式下载,适用于小数据量) + /// + [HttpGet("exportStream")] + [ActionPermissionFilter(Permission = "camworkrecord:export")] + public IActionResult ExportStream([FromQuery] CamWorkrecordQueryDto parm) + { + var list = _CamWorkrecordService.ExportList(parm).Result; + if (list == null || list.Count <= 0) + { + return ToResponse(ResultCode.FAIL, "没有要导出的数据"); + } + var url = OptionsSetting.Upload.UploadUrl; + string savePath = Path.Combine(WebHostEnvironment.WebRootPath); + + var ids = list.Select(x => x.Id).ToList(); + var allImages = _CamWorkrecordImageService.GetListByWorkrecordIds(ids); + var imagesByRecordId = allImages.GroupBy(x => x.WorkrecordId) + .ToDictionary(g => g.Key, g => g.OrderBy(x => x.SortOrder).Select(x => x.ImageUrl).ToList()); + + int i = 1; + list.ForEach(it => + { + var temp = string.IsNullOrEmpty(it.ImageUrl) ? "" : it.ImageUrl; + if (temp.IndexOf("http") > -1) + { + var image = temp.Replace(url, ""); + temp = savePath + image; + } + it.Index = i; + it.ImageUrl = temp; + i++; + }); ExcelPackage.License.SetNonCommercialPersonal("pnaa"); var result = ExportWorkRecordExcel(list, imagesByRecordId, url, savePath, "工作记录", 100, 70, 60); return ExportExcel(result.Item2, result.Item1); diff --git a/server/Zr.Admin.NET/ZR.Model/Business/Dto/CamWorkrecordDto.cs b/server/Zr.Admin.NET/ZR.Model/Business/Dto/CamWorkrecordDto.cs index fdc9aa2..dfefc27 100644 --- a/server/Zr.Admin.NET/ZR.Model/Business/Dto/CamWorkrecordDto.cs +++ b/server/Zr.Admin.NET/ZR.Model/Business/Dto/CamWorkrecordDto.cs @@ -17,6 +17,11 @@ namespace ZR.Model.Business.Dto public string Workrecord { get; set; } public DateTime? BeginRecordTime { get; set; } public DateTime? EndRecordTime { get; set; } + + /// + /// 导出指定ID列表(逗号分隔) + /// + public string Ids { get; set; } } /// diff --git a/server/Zr.Admin.NET/ZR.Service/Business/CamWorkrecordService.cs b/server/Zr.Admin.NET/ZR.Service/Business/CamWorkrecordService.cs index 46fea4a..68ff3cf 100644 --- a/server/Zr.Admin.NET/ZR.Service/Business/CamWorkrecordService.cs +++ b/server/Zr.Admin.NET/ZR.Service/Business/CamWorkrecordService.cs @@ -155,6 +155,14 @@ namespace ZR.Service.Business { var predicate = Expressionable.Create(); + // 支持按ID列表导出 + if (!string.IsNullOrEmpty(parm.Ids)) + { + var idList = parm.Ids.Split(',').Select(int.Parse).ToList(); + predicate = predicate.And(it => idList.Contains(it.Id)); + return predicate; // 按ID导出时忽略其他条件 + } + //predicate = predicate.AndIF(parm.BeginRecordTime == null, it => it.RecordTime >= DateTime.Now.ToShortDateString().ParseToDateTime()); predicate = predicate.AndIF(parm.BeginRecordTime != null, it => it.RecordTime >= parm.BeginRecordTime); predicate = predicate.AndIF(parm.EndRecordTime != null, it => it.RecordTime <= parm.EndRecordTime); diff --git a/server/Zr.Admin.NET/ZR.Vue/src/api/business/camworkrecord.js b/server/Zr.Admin.NET/ZR.Vue/src/api/business/camworkrecord.js index 680b948..13c88c6 100644 --- a/server/Zr.Admin.NET/ZR.Vue/src/api/business/camworkrecord.js +++ b/server/Zr.Admin.NET/ZR.Vue/src/api/business/camworkrecord.js @@ -56,7 +56,16 @@ export function delCamWorkrecord(pid) { method: 'POST' }) } -// 导出工作记录 +// 导出工作记录(旧方式,流式下载) export async function exportCamWorkrecord(query) { await downFile('business/CamWorkrecord/export', { ...query }) } + +// 导出工作记录(新方式,返回下载URL) +export function exportCamWorkrecordUrl(query) { + return request({ + url: 'business/CamWorkrecord/export', + method: 'get', + params: query, + }) +} diff --git a/server/Zr.Admin.NET/ZR.Vue/src/views/business/CamWorkrecord.vue b/server/Zr.Admin.NET/ZR.Vue/src/views/business/CamWorkrecord.vue index 17905b5..90f4135 100644 --- a/server/Zr.Admin.NET/ZR.Vue/src/views/business/CamWorkrecord.vue +++ b/server/Zr.Admin.NET/ZR.Vue/src/views/business/CamWorkrecord.vue @@ -56,6 +56,9 @@ 导出 + + 导出所选 + @@ -364,7 +367,7 @@