using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using JNPF.Common.Configuration; using JNPF.Common.Core.Manager; using JNPF.Common.Extension; using JNPF.Common.Helper; using JNPF.Common.Models; using JNPF.Common.Security; using JNPF.Extras.CollectiveOAuth.Enums; using JNPF.FriendlyException; using Mapster; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; namespace Tnb.WarehouseMgr { public class WmsImportAndExportService { private readonly ISqlSugarClient _db; private readonly IUserManager _userManager; public WmsImportAndExportService(ISqlSugarRepository repository, IUserManager userManager) { _db = repository.AsSugarClient(); _userManager = userManager; } /// /// 载具导入 /// /// /// public async Task CarryImport(IFormFile file) { int row = 0; try { List> dics = WmsImport(file); List carrys = new List(); var carryStdDic = await _db.Queryable().ToDictionaryAsync(x => x.carrystd_code, x => x.id); List locCodes = new(); WmsCarryH carryH = new WmsCarryH(); if (carryStdDic?.Count > 0) { string carryStdId = string.Empty; foreach (var d in dics) { var stdCodeKey = d["carrystd_code"]; carryStdId = carryStdDic.ContainsKey(stdCodeKey) ? carryStdDic[stdCodeKey]?.ToString() ?? "" : ""; d.Add("carrystd_id", carryStdId); locCodes.Add(d["location_code"]); carryH = d.Adapt(); carrys.Add(carryH); } var locs = await _db.Queryable().Where(it => locCodes.Contains(it.location_code)).ToDictionaryAsync(x => x.location_code, x => x.id); foreach (var loc in locCodes) { var c = carrys.Find(x => x.location_code == loc); if (c != null) c.location_id = locs[loc].ToString(); } carrys.ForEach(x => { x.id = SnowflakeIdHelper.NextId(); x.create_id = _userManager.UserId; x.create_time = DateTime.Now; }); } row = await _db.Storageable(carrys).ExecuteCommandAsync(); } catch (Exception) { return false; throw; } return row>0; } /// /// WMS导入 /// /// private static List> WmsImport(IFormFile file) { int rowIndex = 1; List> dics = new List>(); IWorkbook? workbook = null; try { using (Stream stream = file.OpenReadStream()) { // 2007版本 if (file.Name.IndexOf(".xlsx") > 0) workbook = new XSSFWorkbook(stream); else if (file.Name.IndexOf(".xls") > 0) workbook = new HSSFWorkbook(stream); ISheet? sheet = workbook?.GetSheetAt(0); if (workbook == null || sheet == null) throw Oops.Bah("无导入数据"); if (sheet?.LastRowNum <= 1) throw Oops.Bah("无导入数据"); ICellStyle style = workbook.CreateCellStyle(); IFont font = workbook.CreateFont(); font.Color = IndexedColors.Red.Index; // 将字体颜色设置为红色 style.SetFont(font); var nameRow = sheet?.GetRow(0); Dictionary dic = new Dictionary(); if (nameRow != null) { List columns = new List(); columns = nameRow.Cells.Select(x => x.StringCellValue).ToList(); if (columns?.Count > 0) { for (rowIndex = 1; rowIndex <= sheet?.LastRowNum; rowIndex++) { var row = sheet?.GetRow(rowIndex); if (row != null) { foreach (var col in columns) { ICell cell = row.GetCell(columns.IndexOf(col)); dic.Add(col, cell.StringCellValue); } dics.Add(dic); } } } } } } catch (Exception) { throw; } return dics; } /// /// WMS导入模板 /// /// /// /// private static dynamic WmsTemplate(List> dics, string sheetName) { XSSFWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet(sheetName); IRow nRow = sheet.CreateRow(0); IRow dRow = sheet.CreateRow(1); for (int i = 0; i < dics?.Count; i++) { ICell cell1 = nRow.CreateCell(i); cell1.SetCellValue(dics[i].Keys.ToString()); ICell cell2 = dRow.CreateCell(i); cell2.SetCellValue(dics[i].Values.ToString()); } MemoryStream ms = new MemoryStream(); workbook.Write(ms); MemoryStream ms2 = new MemoryStream(ms.ToArray()); ms2.Position = 0; FileStreamResult fileStreamResult = new FileStreamResult(ms2, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = "template.xlsx" }; return fileStreamResult; } } }