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 @@