public async Task <ApiData> ImportMaterials(IFormFile file) { string[] arr = new[] { ".xlsx", ".xls" }; if (arr.Contains(Path.GetExtension(file.FileName)?.ToLower()) == false) { throw new InvalidOperationException("无效的文件扩展名。"); } string filename = await WriteFileAsync(file); DataTable dt = ExcelUtil.ReadDataSet(filename).Tables[0]; int imported = 0; int covered = 0; int empty = 0; foreach (DataRow row in dt.Rows) { string?mcode = Convert.ToString(row["编码"]); if (string.IsNullOrWhiteSpace(mcode)) { // 忽略空行 empty++; continue; } Material material = await _session.Query <Material>().Where(x => x.MaterialCode == mcode).SingleOrDefaultAsync(); if (material != null) { covered++; _logger.Warning("将覆盖已存在的物料 {material}", material.MaterialCode); } else { material = _materialFactory.CreateMaterial(); material.MaterialCode = Convert.ToString(row["编码"]); } material.Description = Convert.ToString(row["描述"]); material.BatchEnabled = Convert.ToBoolean(row["批次管理"]); material.StandingTime = 24; material.ValidDays = Convert.ToInt32(row["有效天数"]); material.MaterialType = Convert.ToString(row["物料类型"]); material.Uom = Convert.ToString(row["计量单位"])?.ToUpper(); material.DefaultQuantity = Convert.ToDecimal(row["每托数量"]); material.Specification = Convert.ToString(row["规格型号"]); string pinyin = GetPinyin(material.Description); if (pinyin.Length > 20) { pinyin = pinyin.Substring(0, 20); } material.MnemonicCode = pinyin; await _session.SaveOrUpdateAsync(material); _logger.Information("已导入物料 {material}", material.MaterialCode); imported++; } _ = await _opHelper.SaveOpAsync($"导入 {imported},覆盖 {covered}"); return(this.Success($"导入 {imported},覆盖 {covered}"));