using Microsoft.AspNetCore.Mvc; using ZR.Model.Business.Dto; using ZR.Model.Business; using ZR.Service.Business.IBusinessService; using MiniExcelLibs.Picture; using SKIT.FlurlHttpClient.Wechat.Api.Models; using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Hosting; using MiniExcelLibs; using System.IO; using IOFile = System.IO.File; using Org.BouncyCastle.Utilities; using Microsoft.Extensions.Configuration.UserSecrets; using MiniExcelLibs.OpenXml; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; using ZR.Infrastructure.Helper; using OfficeOpenXml; using OfficeOpenXml.Drawing; //创建时间:2025-08-18 namespace ZR.Admin.WebApi.Controllers.Business { /// /// 工作记录 /// [Route("business/CamWorkrecord")] public class CamWorkrecordController : BaseController { /// /// 工作记录接口 /// private readonly ICamWorkrecordService _CamWorkrecordService; private OptionsSetting OptionsSetting; private IWebHostEnvironment WebHostEnvironment; private readonly ICamWorkerService _CamWorkerService; public CamWorkrecordController(ICamWorkrecordService CamWorkrecordService, IOptions options, IWebHostEnvironment webHostEnvironment, ICamWorkerService camWorkerService) { _CamWorkrecordService = CamWorkrecordService; OptionsSetting = options.Value; WebHostEnvironment = webHostEnvironment; _CamWorkerService = camWorkerService; } /// /// 查询工作记录列表 /// /// /// [HttpGet("list")] [ActionPermissionFilter(Permission = "camworkrecord:list")] public IActionResult QueryCamWorkrecord([FromQuery] CamWorkrecordQueryDto parm) { var response = _CamWorkrecordService.GetList(parm); return SUCCESS(response); } /// /// 查询工作记录详情 /// /// /// [HttpGet("{Id}")] [ActionPermissionFilter(Permission = "camworkrecord:query")] public IActionResult GetCamWorkrecord(int Id) { var response = _CamWorkrecordService.GetInfo(Id); var info = response.Adapt(); if (info != null) { var names = _CamWorkerService.AsQueryable().Where(it => it.WorkrecordId == info.Id).Select(it => it.WorkerName).ToList(); info.Worker = names != null && names.Count > 0 ? string.Join(",", names) : ""; } return SUCCESS(info); } /// /// 添加工作记录 /// /// [HttpPost] [ActionPermissionFilter(Permission = "camworkrecord:add")] [Log(Title = "工作记录", BusinessType = BusinessType.INSERT)] public IActionResult AddCamWorkrecord([FromBody] CamWorkrecordDto parm) { var modal = parm.Adapt().ToCreate(HttpContext); modal.CreateTime = DateTime.Now; modal.UpdateTime = DateTime.Now; var response = _CamWorkrecordService.AddCamWorkrecord(modal); return SUCCESS(response); } /// /// 更新工作记录 /// /// [HttpPut] [ActionPermissionFilter(Permission = "camworkrecord:edit")] [Log(Title = "工作记录", BusinessType = BusinessType.UPDATE)] public IActionResult UpdateCamWorkrecord([FromBody] CamWorkrecordDto parm) { var modal = parm.Adapt().ToUpdate(HttpContext); modal.UpdateTime = DateTime.Now; var response = _CamWorkrecordService.UpdateCamWorkrecord(modal); return ToResponse(response); } /// /// 删除工作记录 /// /// [HttpPost("delete/{ids}")] [ActionPermissionFilter(Permission = "camworkrecord:delete")] [Log(Title = "工作记录", BusinessType = BusinessType.DELETE)] public IActionResult DeleteCamWorkrecord([FromRoute] string ids) { var idArr = Tools.SplitAndConvert(ids); return ToResponse(_CamWorkrecordService.Delete(idArr, "删除工作记录")); } /// /// 导出工作记录 /// /// [Log(Title = "工作记录", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)] [HttpGet("export")] [ActionPermissionFilter(Permission = "camworkrecord:export")] public IActionResult Export([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); 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; //it.Image = CompressImage(temp, 50); i++; }); ExcelHelper excelHelper = new ExcelHelper(WebHostEnvironment); ExcelPackage.License.SetNonCommercialPersonal("pnaa"); var result = ExportWorkRecordExcel(list, "工作记录", 200, 70, 60); //ExportExcelMini(list, "工作记录", "工作记录"); //ExportExcelWithImagesInBatches(result.Item2, "工作记录", urlList, 10); //loadExcel(); return ExportExcel(result.Item2, result.Item1); } /// public (string fileName, string fullPath) ExportWorkRecordExcel(List list, string fileName, int imageWidth = 100, int imageHeight = 60, int imageQuality = 50) { IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); string sFileName = $"{fileName}_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx"; string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "export", sFileName); Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); using var package = new ExcelPackage(); var ws = package.Workbook.Worksheets.Add("工作记录"); // 写表头 var headers = new[] { "序号","部门名称","拍照时间","经度","纬度","位置","工作内容","施工人员","状态","施工图片","创建时间","更新时间" }; for (int i = 0; i < headers.Length; i++) { ws.Cells[1, i + 1].Value = headers[i]; ws.Cells[1, i + 1].Style.Font.Bold = true; //ws.Column(i).Width = 120; } //ws.Column(10).Width = 40; int row = 2; foreach (var item in list) { ws.Cells[row, 1].Value = item.Index; ws.Cells[row, 2].Value = item.DeptName; ws.Cells[row, 3].Value = item.RecordTime?.ToString("yyyy-MM-dd HH:mm:ss"); ws.Cells[row, 4].Value = item.Longitude; ws.Cells[row, 5].Value = item.Latitude; ws.Cells[row, 6].Value = item.Address; ws.Cells[row, 7].Value = item.Content; ws.Cells[row, 8].Value = item.Worker; ws.Cells[row, 9].Value = item.StatusName; ws.Cells[row, 11].Value = item.CreateTime?.ToString("yyyy-MM-dd HH:mm:ss"); ws.Cells[row, 12].Value = item.UpdateTime?.ToString("yyyy-MM-dd HH:mm:ss"); // 如果 ImageUrl 有值,则压缩后插入 Excel if (!string.IsNullOrEmpty(item.ImageUrl) && IOFile.Exists(item.ImageUrl)) { using var image = SixLabors.ImageSharp.Image.Load(item.ImageUrl); var encoder = new JpegEncoder { Quality = imageQuality }; using var ms = new MemoryStream(); image.Save(ms, encoder); ms.Position = 0; var pic = ws.Drawings.AddPicture($"Pic_{row}_10", ms); pic.SetPosition(row - 1, 5, 9, 5); // 第10列 pic.SetSize(imageWidth, imageHeight); } ws.Row(row).Height = imageHeight; row++; } ws.Cells[ws.Dimension.Address].AutoFitColumns(); ws.Cells[ws.Dimension.Address].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; ws.Column(10).Width = 40; package.SaveAs(new FileInfo(fullPath)); return (sFileName, fullPath); } public byte[] CompressImage(string imagePath, int quality) { // 使用 using 语句确保资源被释放 using (var image = Image.Load(imagePath)) { var encoder = new JpegEncoder { Quality = quality }; using (var outputStream = new MemoryStream()) { image.Save(outputStream, encoder); return outputStream.ToArray(); } } } /// /// 根据图片文件扩展名映射为 ContentType,避免类型不匹配导致 Excel 修复。 /// private static string GetContentTypeByExtension(string filePath) { var ext = Path.GetExtension(filePath)?.ToLowerInvariant(); return ext switch { ".png" => "image/png", ".jpg" => "image/jpeg", ".jpeg" => "image/jpeg", ".gif" => "image/gif", ".bmp" => "image/bmp", ".webp" => "image/webp", // 只有新版本 Excel 兼容,谨慎使用 _ => "image/png" // 默认按 png 处理 }; } } }