using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using System.Text; using System.Web; using Admin.NET.Core; using Yitter.IdGenerator; using StackExchange.Redis; namespace Admin.NET.Application { /// /// 任务管理服务 /// [ApiDescriptionSettings("仓库作业", Name = "WmsTask", Order = 102)] [Route("api/[Controller]")] public class WmsTaskService : IDynamicApiController, ITransient { private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly IRepository _wmsTaskRep; private readonly IRepository _wmsWarehouseEntranceRep; private readonly IRepository _wmsPlaceRep; private readonly IRepository _wmsOrderRep; private readonly IRepository _wmsOrderDetailsRep; private readonly IRepository _wmsContainerPlaceRep; private readonly IRepository _wmsMaterialStockRep; private readonly IRepository _wmsContainerRep; private readonly IRepository _wmsMaterialContainerRep; private readonly IRepository _wmsAreaRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); /// /// 构造函数 /// public WmsTaskService( IRepository sysDictTypeRep, IRepository sysDictDataRep, IRepository wmsTaskRep, IRepository wmsWarehouseEntranceRep, IRepository wmsOrderRep, IRepository wmsOrderDetailsRep, IRepository wmsPlaceRep, IRepository wmsContainerPlaceRep, IRepository wmsMaterialStockRep, IRepository wmsContainerRep, IRepository wmsMaterialContainerRep, IRepository wmsAreaRep, ISysExcelTemplateService sysExcelTemplateService ) { _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _wmsTaskRep = wmsTaskRep; _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep; _wmsOrderRep = wmsOrderRep; _wmsOrderDetailsRep = wmsOrderDetailsRep; _wmsPlaceRep = wmsPlaceRep; _wmsContainerPlaceRep = wmsContainerPlaceRep; _wmsMaterialStockRep = wmsMaterialStockRep; _wmsContainerRep = wmsContainerRep; _wmsMaterialContainerRep = wmsMaterialContainerRep; _wmsAreaRep= wmsAreaRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询出入库任务管理 /// /// /// [HttpGet("page")] public async Task> Page([FromQuery] WmsTaskSearch input) { var wmsTasks = await _wmsTaskRep.DetachedEntities .Where(u => u.AreaName.Contains("绝缘立库")) .Where(!string.IsNullOrEmpty(input.TaskNo), u => EF.Functions.Like(u.TaskNo, $"%{input.TaskNo.Trim()}%")) .Where(input.TaskModel != null, u => u.TaskModel == input.TaskModel) .Where(input.TaskType != null, u => u.TaskType == input.TaskType) .Where(input.TaskStatus != null, u => u.TaskStatus == input.TaskStatus) .Where(!string.IsNullOrEmpty(input.ContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{input.ContainerCode.Trim()}%")) .Where(!string.IsNullOrEmpty(input.AreaName), u => u.AreaName == input.AreaName) .Where(!string.IsNullOrEmpty(input.OrderNo), u => EF.Functions.Like(u.OrderNo, $"%{input.OrderNo.Trim()}%")) .Where(!string.IsNullOrEmpty(input.SourcePlace), u => EF.Functions.Like(u.SourcePlace, $"%{input.SourcePlace.Trim()}%")) .Where(!string.IsNullOrEmpty(input.ToPlace), u => EF.Functions.Like(u.ToPlace, $"%{input.ToPlace.Trim()}%")) .Where(input.Aisle != null, u => u.Aisle == input.Aisle) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsTasks; } /// /// 不分页查询出入库任务管理列表 /// /// 出入库任务管理查询参数 /// (出入库任务管理)实例列表 [HttpGet("listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsTaskSearchNonPage input) { var pTaskNo = input.TaskNo?.Trim() ?? ""; var pTaskModel = input.TaskModel; var pTaskType = input.TaskType; var pTaskLevel = input.TaskLevel; var pTaskStatus = input.TaskStatus; var pIsRead = input.IsRead; var pContainerCode = input.ContainerCode?.Trim() ?? ""; var pAreaName = input.AreaName?.Trim() ?? ""; var pOrderNo = input.OrderNo?.Trim() ?? ""; var pTaskDodeviceStatus = input.TaskDodeviceStatus; var wmsTasks = await _wmsTaskRep.DetachedEntities .Where(!string.IsNullOrEmpty(pTaskNo), u => EF.Functions.Like(u.TaskNo, $"%{pTaskNo}%")) .Where(pTaskModel != null, u => u.TaskModel == pTaskModel) .Where(pTaskType != null, u => u.TaskType == pTaskType) .Where(pTaskLevel != null, u => u.TaskLevel == pTaskLevel) .Where(pTaskStatus != null, u => u.TaskStatus == pTaskStatus) .Where(pIsRead != null, u => u.IsRead == pIsRead) .Where(!string.IsNullOrEmpty(pContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{pContainerCode}%")) .Where(!string.IsNullOrEmpty(pAreaName), u => u.AreaName == pAreaName) .Where(!string.IsNullOrEmpty(pOrderNo), u => EF.Functions.Like(u.OrderNo, $"%{pOrderNo}%")) .Where(pTaskDodeviceStatus != null, u => u.TaskDodeviceStatus == pTaskDodeviceStatus) .OrderBy(PageInputOrder.OrderNonPageBuilder(input)) .ProjectToType() .ToListAsync(); return wmsTasks; } /// /// 增加出入库任务管理 /// /// /// [HttpPost("add")] [NonAction] public async Task Add(AddWmsTaskInput input) { var wmsTask = input.Adapt(); await _wmsTaskRep.InsertAsync(wmsTask); } /// /// 删除出入库任务管理 /// /// /// [HttpPost("delete")] public async Task Delete(DeleteWmsTaskInput input) { var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsTaskRep.DeleteAsync(wmsTask); } /// /// 更新出入库任务管理 /// /// /// [HttpPost("edit")] public async Task Update(UpdateWmsTaskInput input) { var isExist = await _wmsTaskRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D3000); var wmsTask = input.Adapt(); await _wmsTaskRep.UpdateAsync(wmsTask, ignoreNullValues: true); } /// /// 强制完成 /// /// [HttpPost("finish")] [UnitOfWork] public async Task Finish([FromBody] WmsTaskFinishInput input) { //查询任务 var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (wmsTask == null) throw Oops.Oh("任务不存在!"); // 查询混合料库区信息 var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库")); if (wmsArea == null) throw Oops.Oh("库区不存在!"); // 查询托盘信息,呼救AGV时会进行组盘操作 var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode); if (wmsContainer == null) throw Oops.Oh("托盘不存在!"); var statusList = new List { TaskStatusEnum.WEIZHIXING, TaskStatusEnum.ZHIXINGZHONG , TaskStatusEnum .DAIZHIXING}; if (!statusList.Contains(wmsTask.TaskStatus)) throw Oops.Oh("只有未执行和执行中的任务才能强制完成!"); if (wmsTask.TaskType == TaskType.RUKU) // 入库任务 { // 查询库位信息 随机分配库位 var wmsPlace = new WmsPlace(); if (string.IsNullOrEmpty(wmsTask.ToPlace)) wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.Islock == YesOrNot.N && u.PlaceStatus == PlaceStatus.KONGXIAN); else wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.PlaceCode == wmsTask.ToPlace); if (wmsPlace == null) throw Oops.Oh("库位不存在!"); if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!"); if (wmsPlace.PlaceStatus != PlaceStatus.KONGXIAN) throw Oops.Oh("库位已存货!"); // 更新库位状态为“存货” wmsPlace.PlaceStatus = PlaceStatus.CUNHUO; if (wmsTask.Description == "空托") wmsPlace.EmptyContainer = YesOrNot.Y; //是否空托 else wmsPlace.EmptyContainer = YesOrNot.N; // 创建托盘号库位关系表 var wmsContainerPlaceModel = new WmsContainerPlace() { PlaceId = wmsPlace.Id, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, ContainerPlaceStatus = CommonStatus.ENABLE }; await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlaceModel); // 更新库存 var wmsMaterialContainerList = await _wmsMaterialContainerRep.DetachedEntities .Where(p => p.OrderNo ==wmsTask.OrderNo && p.BindStatus == CommonStatus.ENABLE).ProjectToType().ToListAsync(); foreach (var item in wmsMaterialContainerList) { var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.MaterialBatch == item.MaterialBatch); if (wmsMaterialStock != null) { wmsMaterialStock.Source = RuKuSourceEnum.KONGTUO; wmsMaterialStock.AreaId = wmsPlace.AreaId; wmsMaterialStock.PlaceCode = wmsPlace.PlaceCode; wmsMaterialStock.StockNumber += item.BindQuantity; await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock); } else { wmsMaterialStock = new WmsMaterialStock() { InspectionMethod = MaterialInspection.MIANJIAN, UnitType = UnitType.ZHONGLIANG, UnitNo = UnitNoType.T, MaterialNo = item.MaterialNo, MaterialType = MaterialType.CHENGPING, MaterialName = item.MaterialName, MaterialSpec = item.MaterialSpec, MaterialBatch = item.MaterialBatch, MaterialDensity = item.MaterialDensity, StockNumber = 1, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, AreaId = wmsPlace.AreaId, Source = RuKuSourceEnum.KONGTUO, }; await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock); } } // 空料箱入库 if (wmsTask.OrderNo == "N/A") { var wmsMaterialStock = new WmsMaterialStock() { InspectionMethod = MaterialInspection.MIANJIAN, UnitType = UnitType.ZHONGLIANG, UnitNo = UnitNoType.T, MaterialNo = "N/A", MaterialType = MaterialType.KONGTUO, MaterialName = "N/A", MaterialSpec = "N/A", MaterialBatch = "N/A", MaterialDensity = "N/A", StockNumber = 0, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, AreaId = wmsPlace.AreaId, Source = RuKuSourceEnum.KONGTUO, }; await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock); } // 更新任务状态、设备任务状态、托盘编号、目标位置、库区名称 wmsTask.TaskStatus = TaskStatusEnum.WANCHENG; wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W; wmsTask.ContainerCode = wmsContainer.ContainerCode; wmsTask.ToPlace = wmsPlace.PlaceCode; wmsTask.AreaName = wmsPlace.WmsArea.AreaName; wmsTask.IsRead = true; // 更新库位状态为存货 wmsPlace.PlaceStatus = PlaceStatus.CUNHUO; await _wmsPlaceRep.UpdateAsync(wmsPlace); // 更新托盘状态为“库位” wmsContainer.ContainerStatus = ContainerStatus.KUWEI; await _wmsContainerRep.UpdateAsync(wmsContainer); } else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务 { var wmsMaterialContainerList = new List(); // 查询库位信息 var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace); if (wmsPlace == null) throw Oops.Oh("库位信息不存在!"); if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!"); //if (wmsPlace != null && wmsPlace.PlaceStatus != PlaceStatus.DAICHU) throw Oops.Oh("库位异常货!"); // 查询是否已存在托盘与库位的关系 var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == wmsPlace.Id && z.PlaceCode == wmsPlace.PlaceCode && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE); if (wmsContainerPlace == null) throw Oops.Oh("库位容器关系不存在!"); // 不是空托才会有组盘关系 if (wmsPlace.EmptyContainer == YesOrNot.N) { // 检查物料与空托号关系 wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync(); if (wmsMaterialContainerList.Count <= 0) throw Oops.Oh("托盘号与物料关系不存在!"); } else { // 更新空料箱库存 var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsContainer.ContainerCode); if (wmsMaterialStock.Source == RuKuSourceEnum.KONGTUO) { await _wmsMaterialStockRep.DeleteAsync(wmsMaterialStock); } } //构建出库物料和周转箱号关系 var orderNo = "N/A"; if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString(); foreach (var wmsMaterialContaine in wmsMaterialContainerList) { //更新状态为”删除“ wmsMaterialContaine.BindStatus = CommonStatus.DELETED; await _wmsMaterialContainerRep.UpdateNowAsync(wmsMaterialContaine); //新增组盘绑定记录 正常 var addWmsMaterialContainer = wmsMaterialContaine; addWmsMaterialContainer.Id = YitIdHelper.NextId(); addWmsMaterialContainer.OrderNo = orderNo; addWmsMaterialContainer.BindStatus = CommonStatus.ENABLE; await _wmsMaterialContainerRep.InsertNowAsync(addWmsMaterialContainer); // 这里没有分拣操作直接更新库存信息 var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(u => u.ContainerCode == wmsMaterialContaine.ContainerCode); wmsMaterialStock.PlaceCode = "N/A"; wmsMaterialStock.StockNumber -= wmsMaterialContaine.BindQuantity; await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock); } //更新任务状态 wmsTask.TaskStatus = TaskStatusEnum.WANCHENG; wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W; wmsTask.IsRead = true; // 禁用托盘库位关系 wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED; await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace); // 更新库位状态为“空闲” wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN; await _wmsPlaceRep.UpdateAsync(wmsPlace); // 更新托盘状态为“空闲” wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN; await _wmsContainerRep.UpdateAsync(wmsContainer); } else //移库任务 { } await _wmsTaskRep.UpdateAsync(wmsTask); } /// /// 更新优先级(向上) /// /// [HttpPost("upwardTaskLevel")] public async Task UpwardTaskLevel([FromBody] UpdateTaskLevelInput input) { var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (wmsTask == null) throw Oops.Oh("任务不存在!"); if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能更新任务优先级!"); if(wmsTask.TaskLevel==5) throw Oops.Oh("任务已为最高级别!"); wmsTask.TaskLevel += 1; await _wmsTaskRep.UpdateAsync(wmsTask); } /// /// 更新优先级(向下) /// /// [HttpPost("downTaskLevel")] public async Task DownTaskLevel([FromBody] UpdateTaskLevelInput input) { var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (wmsTask == null) throw Oops.Oh("任务不存在!"); if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能更新任务优先级!"); if (wmsTask.TaskLevel == 1) throw Oops.Oh("任务已为最低级别!"); wmsTask.TaskLevel -= 1; await _wmsTaskRep.UpdateAsync(wmsTask); } /// /// 取消 /// /// /// [HttpPost("CancelTask")] public async Task CancelTask([FromBody] CancelInput input) { var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (wmsTask == null) throw Oops.Oh("任务不存在!"); if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能取消任务!"); wmsTask.TaskStatus = TaskStatusEnum.QUXIAO; wmsTask.IsRead=true; await _wmsTaskRep.UpdateAsync(wmsTask); } /// /// 批量取消 /// /// /// [HttpPost("batchCancel")] public async Task BatchCancel([FromBody] BatchCancelInput input) { int length = input.Id.Count; for (int i = 0; i < length; i++) { long Id = input.Id[i]; var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id); if (wmsTask == null) throw Oops.Oh("任务不存在!"); if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能取消任务!"); wmsTask.TaskStatus = TaskStatusEnum.QUXIAO; await _wmsTaskRep.UpdateAsync(wmsTask); } } /// /// 批量暂停 /// /// /// [HttpPost("batchBreak")] public async Task BatchBreak([FromBody] BatchBreakInput input) { int length = input.Id.Count; for (int i = 0; i < length; i++) { long Id = input.Id[i]; var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id); if (wmsTask == null) throw Oops.Oh("任务不存在!"); if (wmsTask.TaskStatus != TaskStatusEnum.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能暂停任务!"); wmsTask.TaskStatus = TaskStatusEnum.ZANTING; await _wmsTaskRep.UpdateAsync(wmsTask); } } /// /// 批量继续 /// /// /// [HttpPost("batchContinue")] public async Task BatchContinue([FromBody] BatchContinueInput input) { int length = input.Id.Count; for (int i = 0; i < length; i++) { long Id = input.Id[i]; var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.Id == Id); if (wmsTask == null) throw Oops.Oh("任务不存在!"); if (wmsTask.TaskStatus != TaskStatusEnum.ZANTING) throw Oops.Oh("只有暂停的任务才能继续任务!"); wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING; await _wmsTaskRep.UpdateAsync(wmsTask); } } /// /// 获取出入库任务管理 /// /// /// [HttpGet("detail")] public async Task Get([FromQuery] QueryeWmsTaskInput input) { return (await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取出入库任务管理列表 /// /// /// [HttpGet("list")] public async Task> List([FromQuery] TaskInput input) { return await _wmsTaskRep.DetachedEntities.ProjectToType().ToListAsync(); } /// /// Excel模板导入出入库任务管理功能 /// /// Excel模板文件 /// Excel导入方式 /// 导入的记录数 [HttpPost("fromExcel")] public async Task FromExcelAsync(IFormFile file, [FromQuery] ImportExcelType importExcelType) { int size = 200; var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", "v2"); if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002); var keys = excelTemplate.UnionUniqueFields.Split(",") ?? Array.Empty(); for (var i = 0; i < keys.Length; i++) { keys[i] = keys[i]?.Trim() ?? string.Empty; } ExcelUtil.FromExcel(file, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, out List headers, out List> data, out string sheetName); List wmsTaskList = DataConvertUtil.ToObjectList(headers, data, sheetName, keys, excelTemplate?.DataStartLine ?? 2, out Dictionary dict); List> uniqueKeyValueDictList = wmsTaskList.ParseUniqueKeyValueDictList(keys.ToList(), excelTemplate?.DataStartLine ?? 2, sheetName); var filters = DataConvertUtil.GetExpressionListByUniqueDict(keys.ToList(), uniqueKeyValueDictList, size); var selectKeys = keys.ToList(); if (!selectKeys.Contains("Id")) selectKeys.Add("Id"); var selector = DataConvertUtil.GetSelectExpressionListByUniqueDict(selectKeys); List updates = new(); List adds = new(); lock (_lock) { foreach (var filter in filters) { var wmsTaskExistSubList = _wmsTaskRep.Where(filter).Select(selector).ToList(); wmsTaskExistSubList.ForEach(x => { var k = DataConvertUtil.GetKey(x, keys); if (dict.ContainsKey(k)) dict[k].Id = x.Id; }); } foreach (var wmsTask in wmsTaskList) { if (wmsTask.Id > 0) { if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.Add(wmsTask.Adapt()); } else { adds.Add(wmsTask.Adapt()); } } if (importExcelType == ImportExcelType.ADD_AND_UPDATE) updates.ForEach(x => _wmsTaskRep.Update(x)); var maxId = _wmsTaskRep.DetachedEntities.OrderByDescending(x => x.Id).Select(x => x.Id).FirstOrDefault(); adds.ForEach(x => x.Id = ++maxId); Db.GetDbContext().Set().AddRange(adds); Db.GetDbContext().SaveChanges(); } await Task.CompletedTask; return adds.Count; } /// /// 根据版本下载出入库任务管理的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [HttpGet("downloadExcelTemplate")] public async Task DownloadExcelTemplate([FromQuery] string version) { var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", version); if (excelTemplate == null) throw Oops.Oh(ErrorCode.Excel002); var path = Path.Combine(@"\", excelTemplate.TemplateFileName); Stream ms = FileUtil.Download(path, excelTemplate.TemplateFileName); var fileName = HttpUtility.UrlEncode($"{excelTemplate.Name}导入模板.xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName }; } /// /// 根据出入库任务管理查询参数导出Excel /// /// 出入库任务管理(熟化库)查询参数 /// 导出的Excel文件 [HttpGet("toExcel")] public async Task ToExcelAsync([FromQuery] WmsTaskSearchNonPage input) { var wmsTaskList = await ListNonPageAsync(input); MemoryStream ms = new(); DataConvertUtil.ToExcelData(wmsTaskList, _sysDictTypeRep, _sysDictDataRep, out List headers, out List> data, out string sheetName); var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("WmsTask", "v1"); if (excelTemplate != null) { ExcelUtil.ToExcel(excelTemplate.TemplateFileName, headers, data, sheetName, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, ms); } else { ExcelUtil.ToExcel(headers, data, sheetName, ms); } ms.Position = 0; var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName }; } } }