From 8a0f6571d7b0a7912be851deddedbfea1b1170de Mon Sep 17 00:00:00 2001 From: gcw_MV9p2JJN Date: Tue, 18 Nov 2025 14:34:26 +0800 Subject: [PATCH] =?UTF-8?q?BOM=20=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wwwroot/ImportTemplate/MaterialMODEL.xlsx | Bin 0 -> 35188 bytes DOAN.Service/DOAN.Service.csproj | 1 - DOAN.ServiceCore/DOAN.ServiceCore.csproj | 1 + Infrastructure/Controllers/BaseController.cs | 4 + .../Assets/ImportTemplate/MaterialMODEL.xlsx | Bin 0 -> 35188 bytes .../Material/MaterialBomController.cs | 17 ++ .../Material/MaterialListController.cs | 51 +++++ .../Material/MaterialTypeController.cs | 53 +++++ MES_Model/MDM.csproj | 8 + .../Models/Material/Dto/MaterialBomDto.cs | 3 + .../Material/IService/IMaterialBomService.cs | 12 ++ .../Material/IService/IMaterialListService.cs | 5 + .../Material/IService/IMaterialTypeService.cs | 6 + .../Services/Material/MaterialBomService.cs | 184 ++++++++++++++++- .../Services/Material/MaterialListService.cs | 190 ++++++++++++++++++ .../Services/Material/MaterialTypeService.cs | 132 ++++++++++++ 16 files changed, 664 insertions(+), 3 deletions(-) create mode 100644 DOAN.Admin.WebApi/wwwroot/ImportTemplate/MaterialMODEL.xlsx create mode 100644 MES_Model/Assets/ImportTemplate/MaterialMODEL.xlsx diff --git a/DOAN.Admin.WebApi/wwwroot/ImportTemplate/MaterialMODEL.xlsx b/DOAN.Admin.WebApi/wwwroot/ImportTemplate/MaterialMODEL.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..df09c79af776e1e7297acf7ee903050814286dd0 GIT binary patch literal 35188 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

LN+K+0=X%sZ(2`@cDgAQk~-;>3!?zcw1>^!ZKW! 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 D4Z-Io literal 0 HcmV?d00001 diff --git a/DOAN.Service/DOAN.Service.csproj b/DOAN.Service/DOAN.Service.csproj index 4384de7..3fa5064 100644 --- a/DOAN.Service/DOAN.Service.csproj +++ b/DOAN.Service/DOAN.Service.csproj @@ -17,7 +17,6 @@ - diff --git a/DOAN.ServiceCore/DOAN.ServiceCore.csproj b/DOAN.ServiceCore/DOAN.ServiceCore.csproj index 17ea851..d7bee41 100644 --- a/DOAN.ServiceCore/DOAN.ServiceCore.csproj +++ b/DOAN.ServiceCore/DOAN.ServiceCore.csproj @@ -16,6 +16,7 @@ + diff --git a/Infrastructure/Controllers/BaseController.cs b/Infrastructure/Controllers/BaseController.cs index 9a88f4e..a51b348 100644 --- a/Infrastructure/Controllers/BaseController.cs +++ b/Infrastructure/Controllers/BaseController.cs @@ -210,10 +210,14 @@ namespace Infrastructure.Controllers protected (string, string) DownloadImportTemplate(string fileName) { IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); + // string path= "./Assets/ImportTemplate"; string sFileName = $"{fileName}.xlsx"; string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "ImportTemplate", sFileName); return (sFileName, fullPath); } + + + } } diff --git a/MES_Model/Assets/ImportTemplate/MaterialMODEL.xlsx b/MES_Model/Assets/ImportTemplate/MaterialMODEL.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..df09c79af776e1e7297acf7ee903050814286dd0 GIT binary patch literal 35188 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

LN+K+0=X%sZ(2`@cDgAQk~-;>3!?zcw1>^!ZKW! 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 D4Z-Io literal 0 HcmV?d00001 diff --git a/MES_Model/Controllers/Material/MaterialBomController.cs b/MES_Model/Controllers/Material/MaterialBomController.cs index 8333df2..1816448 100644 --- a/MES_Model/Controllers/Material/MaterialBomController.cs +++ b/MES_Model/Controllers/Material/MaterialBomController.cs @@ -13,6 +13,7 @@ using MDM.Services.IMaterialService; using MDM.Model.Material.Dto; using MDM.Model.Material; using MDM.Repository; +using DOAN.Model.MES.base_.Dto; //创建时间:2025-11-15 namespace MDM.Controllers.Material @@ -112,6 +113,22 @@ namespace MDM.Controllers.Material } + //TODO 获取母件 + [HttpPost("get_monter_inv")] + public IActionResult GetMonterInvList([FromBody] MaterialBomQueryDto parm) + { + var response = _MaterialBomService.GetMonterInvList(parm); + return SUCCESS(response); + } + + //TODO 获取子件 + [HttpPost("get_son_inv")] + public IActionResult GetSonInvList([FromBody] MaterialBomQueryDto parm) + { + + var response = _MaterialBomService.GetSonInvList(parm); + return SUCCESS(response); + } } diff --git a/MES_Model/Controllers/Material/MaterialListController.cs b/MES_Model/Controllers/Material/MaterialListController.cs index 391ec1d..bd8f898 100644 --- a/MES_Model/Controllers/Material/MaterialListController.cs +++ b/MES_Model/Controllers/Material/MaterialListController.cs @@ -12,6 +12,9 @@ using Infrastructure.Model; using MDM.Services.IMaterialService; using MDM.Model.Material.Dto; using MDM.Model.Material; +using MDM.Services.Material; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; //创建时间:2025-11-15 namespace MDM.Controllers.Material @@ -111,6 +114,54 @@ namespace MDM.Controllers.Material } + //TODO 导出模板 + [HttpGet("importTemplate")] + [Log(Title = "物料类型模板", BusinessType = BusinessType.EXPORT, IsSaveRequestData = true, IsSaveResponseData = false)] + [AllowAnonymous] + public IActionResult ImportTemplateExcel() + { + string path = "./Assets/ImportTemplate"; + string sFileName = $"MaterialMODEL.xlsx"; + string fullPath = Path.Combine(path, sFileName); + (string, string) result = (sFileName, fullPath); + return ExportExcel(result.Item2, result.Item1); + } + + + //TODO 导入excel + [HttpPost("importData")] + [Log(Title = "物料类型导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false, IsSaveResponseData = true)] + [AllowAnonymous] + public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile) + { + + if (formFile == null) + { + return SUCCESS(null); + } + int response = _MaterialListService.ImportData(formFile, HttpContext.GetName()); + + return SUCCESS(response); + } + + //TODO 导出excel + [HttpGet("exportData")] + [Log(Title = "物料类型导出", BusinessType = BusinessType.EXPORT, IsSaveRequestData = true, IsSaveResponseData = false)] + [AllowAnonymous] + public IActionResult ExportData() + { + + var excelBytes = _MaterialListService.ExportData(); + string fileName = $"PlanAchievementRate_{DateTime.Now.Date:yyyyMMdd}.xlsx"; + return File( + excelBytes, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + fileName + ); + + } + + } diff --git a/MES_Model/Controllers/Material/MaterialTypeController.cs b/MES_Model/Controllers/Material/MaterialTypeController.cs index 6dff0e1..5e5bfc5 100644 --- a/MES_Model/Controllers/Material/MaterialTypeController.cs +++ b/MES_Model/Controllers/Material/MaterialTypeController.cs @@ -12,6 +12,11 @@ using Infrastructure.Model; using MDM.Services.IMaterialService; using MDM.Model.Material.Dto; using MDM.Model.Material; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Hosting; +using NPOI.HPSF; +using DOAN.Model.Mobile.Dto; //创建时间:2025-11-15 namespace MDM.Controllers.Material @@ -111,6 +116,54 @@ namespace MDM.Controllers.Material } + //TODO 导出模板 + [HttpGet("importTemplate")] + [Log(Title = "物料类型模板", BusinessType = BusinessType.EXPORT, IsSaveRequestData = true, IsSaveResponseData = false)] + [AllowAnonymous] + public IActionResult ImportTemplateExcel() + { + string path= "./Assets/ImportTemplate"; + string sFileName = $"MaterialMODEL.xlsx"; + string fullPath = Path.Combine(path, sFileName); + (string, string) result = (sFileName,fullPath); + return ExportExcel(result.Item2, result.Item1); + } + + + //TODO 导入excel + [HttpPost("importData")] + [Log(Title = "物料类型导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false, IsSaveResponseData = true)] + [AllowAnonymous] + public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile) + { + + if (formFile == null) + { + return SUCCESS(null); + } + int response = _MaterialTypeService.ImportData(formFile, HttpContext.GetName()); + + return SUCCESS(response); + } + + //TODO 导出excel + [HttpGet("exportData")] + [Log(Title = "物料类型导出", BusinessType = BusinessType.EXPORT, IsSaveRequestData = true, IsSaveResponseData = false)] + [AllowAnonymous] + public IActionResult ExportData() + { + + var excelBytes = _MaterialTypeService.ExportData(); + string fileName = $"PlanAchievementRate_{DateTime.Now.Date:yyyyMMdd}.xlsx"; + return File( + excelBytes, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + fileName + ); + + } + + } diff --git a/MES_Model/MDM.csproj b/MES_Model/MDM.csproj index 63df30d..eef89ab 100644 --- a/MES_Model/MDM.csproj +++ b/MES_Model/MDM.csproj @@ -10,6 +10,14 @@ + + + true + PreserveNewest + Always + + + diff --git a/MES_Model/Models/Material/Dto/MaterialBomDto.cs b/MES_Model/Models/Material/Dto/MaterialBomDto.cs index 355b7f3..4f45dbb 100644 --- a/MES_Model/Models/Material/Dto/MaterialBomDto.cs +++ b/MES_Model/Models/Material/Dto/MaterialBomDto.cs @@ -2,11 +2,14 @@ using System.ComponentModel.DataAnnotations; namespace MDM.Model.Material.Dto { + ///

/// 查询对象 /// public class MaterialBomQueryDto : PagerInfo { + public string InvCode { get; set; } + public string SubInvCode { get; set; } } /// diff --git a/MES_Model/Services/Material/IService/IMaterialBomService.cs b/MES_Model/Services/Material/IService/IMaterialBomService.cs index bd0f7fc..4b6f095 100644 --- a/MES_Model/Services/Material/IService/IMaterialBomService.cs +++ b/MES_Model/Services/Material/IService/IMaterialBomService.cs @@ -3,6 +3,7 @@ using MDM.Model; using MDM.Model.Material; using MDM.Model.Material.Dto; using MDM.Service; +using Microsoft.AspNetCore.Http; namespace MDM.Services.IMaterialService { @@ -13,11 +14,22 @@ namespace MDM.Services.IMaterialService { PagedInfo GetList(MaterialBomQueryDto parm); + PagedInfo GetMonterInvList(MaterialBomQueryDto parm); + + List GetSonInvList(MaterialBomQueryDto parm); + MaterialBom GetInfo(string Id); MaterialBom AddMaterialBom(MaterialBom parm); int UpdateMaterialBom(MaterialBom parm); + int ImportData(IFormFile formFile, string name); + + + byte[] ExportData(); + + + } } diff --git a/MES_Model/Services/Material/IService/IMaterialListService.cs b/MES_Model/Services/Material/IService/IMaterialListService.cs index a3cc1b9..09b1df4 100644 --- a/MES_Model/Services/Material/IService/IMaterialListService.cs +++ b/MES_Model/Services/Material/IService/IMaterialListService.cs @@ -2,6 +2,7 @@ using MDM.Model; using MDM.Model.Material; using MDM.Model.Material.Dto; using MDM.Service; +using Microsoft.AspNetCore.Http; namespace MDM.Services.IMaterialService { @@ -17,6 +18,10 @@ namespace MDM.Services.IMaterialService MaterialList AddMaterialList(MaterialList parm); int UpdateMaterialList(MaterialList parm); + int ImportData(IFormFile formFile, string name); + + + byte[] ExportData(); } } diff --git a/MES_Model/Services/Material/IService/IMaterialTypeService.cs b/MES_Model/Services/Material/IService/IMaterialTypeService.cs index 36ba00e..b6e21b9 100644 --- a/MES_Model/Services/Material/IService/IMaterialTypeService.cs +++ b/MES_Model/Services/Material/IService/IMaterialTypeService.cs @@ -2,6 +2,7 @@ using MDM.Model; using MDM.Model.Material; using MDM.Model.Material.Dto; using MDM.Service; +using Microsoft.AspNetCore.Http; namespace MDM.Services.IMaterialService { @@ -18,5 +19,10 @@ namespace MDM.Services.IMaterialService int UpdateMaterialType(MaterialType parm); + int ImportData(IFormFile formFile, string name); + + + byte[] ExportData(); + } } diff --git a/MES_Model/Services/Material/MaterialBomService.cs b/MES_Model/Services/Material/MaterialBomService.cs index 3a2d944..fc2d2f1 100644 --- a/MES_Model/Services/Material/MaterialBomService.cs +++ b/MES_Model/Services/Material/MaterialBomService.cs @@ -1,5 +1,7 @@ + +using Infrastructure; using Infrastructure.Attribute; using MDM.Model; using MDM.Model.Material; @@ -7,6 +9,9 @@ using MDM.Model.Material.Dto; using MDM.Repository; using MDM.Service; using MDM.Services.IMaterialService; +using Microsoft.AspNetCore.Http; +using NPOI.SS.UserModel; +using NPOI.XSSF.UserModel; using System.Linq.Expressions; @@ -25,7 +30,13 @@ namespace MES_Model.Services.Material /// public PagedInfo GetList(MaterialBomQueryDto parm) { - var predicate = Expressionable.Create(); + var predicate = Expressionable.Create() + .AndIF(!string.IsNullOrEmpty(parm.InvCode), it => it.InvCode.Contains(parm.InvCode)) + .AndIF(!string.IsNullOrEmpty(parm.SubInvCode), it => it.SubInvCode.Contains(parm.SubInvCode)) + ; + + + ; var response = Queryable() .Where(predicate.ToExpression()) @@ -33,7 +44,55 @@ namespace MES_Model.Services.Material return response; } + /// + /// 获取母件BOM清单 + /// + /// + /// + public PagedInfo GetMonterInvList(MaterialBomQueryDto parm) + { + var predicate = Expressionable.Create() + .AndIF(!string.IsNullOrEmpty(parm.InvCode), it => it.InvCode.Contains(parm.InvCode)) + .AndIF(!string.IsNullOrEmpty(parm.SubInvCode), it => it.SubInvCode.Contains(parm.SubInvCode)) + ; + var query = Context.Queryable() + .Where(predicate.ToExpression()) + .GroupBy(it => it.InvCode) + .Select(it => new MaterialBomDto() + { + + Id = SqlFunc.AggregateMax(it.Id), + InvCode = SqlFunc.AggregateMax(it.InvCode), + InvName = SqlFunc.AggregateMax(it.InvName), + SubInvName = SqlFunc.AggregateMax(it.SubInvName), + Iusequantity = SqlFunc.AggregateMax(it.Iusequantity), + BOMVersion = SqlFunc.AggregateMax(it.BOMVersion), + CreatedBy = SqlFunc.AggregateMax(it.CreatedBy), + CreatedTime = SqlFunc.AggregateMax(it.CreatedTime), + UpdatedBy = SqlFunc.AggregateMax(it.UpdatedBy), + UpdatedTime = SqlFunc.AggregateMax(it.UpdatedTime) + + + }); + var response = query.ToPage(parm); + + + return response; + + + } + + /// + /// 获取子件 + /// + /// + /// + public List GetSonInvList(MaterialBomQueryDto parm) + { + return Context.Queryable().Where(it => it.InvCode == parm.InvCode).ToList(); + + } /// /// 获取详情 @@ -83,6 +142,127 @@ namespace MES_Model.Services.Material return Update(model, true); } - + public int ImportData(IFormFile formFile, string name) + { + using (var stream = formFile.OpenReadStream()) + { + try + { + IWorkbook workbook = new XSSFWorkbook(stream); + ISheet sheet = workbook.GetSheet("物料BOM清单"); + List materialBoms = new List(); + // 遍历每一行 + for (int row = 1; row <= sheet.LastRowNum; row++) + { + IRow currentRow = sheet.GetRow(row); + if (currentRow != null && currentRow.GetCell(0) != null) // 确保行不为空 + { + MaterialBom item = new MaterialBom(); + item.Id = XueHua; + //母件编码 + if (currentRow.GetCell(0) != null && currentRow.GetCell(0).CellType == CellType.String) + item.InvCode = currentRow.GetCell(0).ToString(); + //母件名称 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.InvName = currentRow.GetCell(1).ToString(); + //母件名称 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.InvName = currentRow.GetCell(1).ToString(); + + //子件编码 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.SubInvCode = currentRow.GetCell(1).ToString(); + //子件名称 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.SubInvName = currentRow.GetCell(1).ToString(); + //使用数量 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.Iusequantity = currentRow.GetCell(1).ToString(); + + + //BOM版本号 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.BOMVersion = currentRow.GetCell(1).ToString(); + + materialBoms.Add(item); + + } + } + + if (materialBoms.Count == 0) + { + return 0; + } + UseTran2(() => + { + // Context.Deleteable().Where(it => it.RecordDate == RecordDate.Date).ExecuteCommand(); + Context.Insertable(materialBoms).ExecuteCommand(); + }); + return materialBoms.Count; + } + catch (Exception ex) + { + throw new CustomException("excel文件异常,请详细核对"); + + + } + + + + } + + } + + + public byte[] ExportData() + { + string templatePath = Path.Combine( + Directory.GetCurrentDirectory(), + "wwwroot", + "ImportTemplate", + "MaterialMODEL.xlsx" + ); + + if (!global::System.IO.File.Exists(templatePath)) + { + throw new CustomException("Excel 模板文件不存在"); + } + + List dataList = Context.Queryable() + .Where(it => it.Status == 1) + .ToList(); + + using (var fileStream = new FileStream(templatePath, FileMode.Open, FileAccess.Read)) + { + IWorkbook workbook = WorkbookFactory.Create(fileStream); + ISheet sheet = workbook.GetSheet("物料类型"); + + int startRowIndex = 1; + for (int i = 0; i < dataList.Count; i++) + { + var item = dataList[i]; + IRow row = sheet.GetRow(startRowIndex + i) ?? sheet.CreateRow(startRowIndex + i); + + // 为每个需要数字的单元格设置值,并应用 numberCellStyle + row.CreateCell(0).SetCellValue(item.Name); + + // 以下为字符串类型字段,不需要数字格式 + row.CreateCell(1).SetCellValue(item.Code); + row.CreateCell(2).SetCellValue(item.ParentCode); + row.CreateCell(3).SetCellValue((double)item.Status); + } + + // 改为写入 MemoryStream 然后转成 byte[] + var memoryStream = new MemoryStream(); + workbook.Write(memoryStream); + // memoryStream.Position = 0; + return memoryStream.ToArray(); // ✅ 直接返回 byte 数组 + } + + + + } + + } } \ No newline at end of file diff --git a/MES_Model/Services/Material/MaterialListService.cs b/MES_Model/Services/Material/MaterialListService.cs index 8365993..b9f1355 100644 --- a/MES_Model/Services/Material/MaterialListService.cs +++ b/MES_Model/Services/Material/MaterialListService.cs @@ -1,3 +1,4 @@ +using Infrastructure; using Infrastructure.Attribute; using MDM.Model; using MDM.Model.Material; @@ -5,6 +6,9 @@ using MDM.Model.Material.Dto; using MDM.Repository; using MDM.Service; using MDM.Services.IMaterialService; +using Microsoft.AspNetCore.Http; +using NPOI.SS.UserModel; +using NPOI.XSSF.UserModel; @@ -92,5 +96,191 @@ namespace MDM.Services.Material return Update(model, true); } + public int ImportData(IFormFile formFile, string name) + { + using (var stream = formFile.OpenReadStream()) + { + try + { + IWorkbook workbook = new XSSFWorkbook(stream); + ISheet sheet = workbook.GetSheet("物料列表"); + List materialLists = new List(); + // 遍历每一行 + for (int row = 1; row <= sheet.LastRowNum; row++) + { + IRow currentRow = sheet.GetRow(row); + if (currentRow != null && currentRow.GetCell(0) != null) // 确保行不为空 + { + MaterialList item = new MaterialList(); + item.Id = XueHua; + //物料类型code + if (currentRow.GetCell(0) != null && currentRow.GetCell(0).CellType == CellType.String) + item.FkMaterialTypeCode = currentRow.GetCell(0).ToString(); + //物料名称 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.Name = currentRow.GetCell(1).ToString(); + + //物料编码 + if (currentRow.GetCell(2) != null && currentRow.GetCell(2).CellType == CellType.String) + item.Code = currentRow.GetCell(2).ToString(); + + //物料代码 + if (currentRow.GetCell(3) != null && currentRow.GetCell(3).CellType == CellType.String) + item.Addcode = currentRow.GetCell(3).ToString(); + + + //客户编码 + if (currentRow.GetCell(4) != null && currentRow.GetCell(4).CellType == CellType.String) + item.CustomerCode = currentRow.GetCell(4).ToString(); + + //颜色 + if (currentRow.GetCell(5) != null && currentRow.GetCell(5).CellType == CellType.String) + item.Color = currentRow.GetCell(5).ToString(); + + //规格型号 + if (currentRow.GetCell(6) != null && currentRow.GetCell(6).CellType == CellType.String) + item.Specification = currentRow.GetCell(6).ToString(); + + + //单位 + if (currentRow.GetCell(7) != null && currentRow.GetCell(7).CellType == CellType.String) + item.Unit = currentRow.GetCell(7).ToString(); + + //描述 + if (currentRow.GetCell(7) != null && currentRow.GetCell(7).CellType == CellType.String) + item.Description = currentRow.GetCell(7).ToString(); + + //供应商代码 + if (currentRow.GetCell(7) != null && currentRow.GetCell(7).CellType == CellType.String) + item.SupplierCode = currentRow.GetCell(7).ToString(); + + //保质期单位 + if (currentRow.GetCell(8) != null && currentRow.GetCell(8).CellType == CellType.String) + item.ExpirationUnit = currentRow.GetCell(8).ToString(); + + //保质期单位 + if (currentRow.GetCell(8) != null && currentRow.GetCell(8).CellType == CellType.String) + item.ExpirationUnit = currentRow.GetCell(8).ToString(); + + //保质期(天) + if (currentRow.GetCell(9) != null && currentRow.GetCell(9).CellType == CellType.Numeric) + item.ExpirationDate =Convert.ToInt16(currentRow.GetCell(9).ToString()); + + + //保质期预警天数 + if (currentRow.GetCell(10) != null && currentRow.GetCell(10).CellType == CellType.Numeric) + item.ShelfLifeWarningDays = Convert.ToInt16(currentRow.GetCell(10).ToString()); + + //是否有效期管理 + if (currentRow.GetCell(11) != null && currentRow.GetCell(11).CellType == CellType.Numeric) + item.IsShelfLife = Convert.ToInt16(currentRow.GetCell(11).ToString()); + + + //启用日期 + //if (currentRow.GetCell(12) != null && currentRow.GetCell(12).CellType == CellType.Formula) + // item.StartTime = Convert.ToInt16(currentRow.GetCell(12).ToString()); + + + + //对应条码 + if (currentRow.GetCell(12) != null && currentRow.GetCell(12).CellType == CellType.String) + item.BarCode = currentRow.GetCell(12).ToString(); + + + + + + + + materialLists.Add(item); + + } + } + + if (materialLists.Count == 0) + { + return 0; + } + UseTran2(() => + { + // Context.Deleteable().Where(it => it.RecordDate == RecordDate.Date).ExecuteCommand(); + Context.Insertable(materialLists).ExecuteCommand(); + }); + return materialLists.Count; + + } + catch (Exception ex) + { + throw new CustomException("excel文件异常,请详细核对"); + + + } + + + + } + + } + + + public byte[] ExportData() + { + string templatePath = Path.Combine( + Directory.GetCurrentDirectory(), + "Assets", + "ImportTemplate", + "MaterialMODEL.xlsx" + ); + + if (!global::System.IO.File.Exists(templatePath)) + { + throw new CustomException("Excel 模板文件不存在"); + } + + List dataList = Context.Queryable() + .ToList(); + + using (var fileStream = new FileStream(templatePath, FileMode.Open, FileAccess.Read)) + { + IWorkbook workbook = WorkbookFactory.Create(fileStream); + ISheet sheet = workbook.GetSheet("物料台账"); + + int startRowIndex = 1; + for (int i = 0; i < dataList.Count; i++) + { + var item = dataList[i]; + IRow row = sheet.GetRow(startRowIndex + i) ?? sheet.CreateRow(startRowIndex + i); + + + row.CreateCell(0).SetCellValue(item.FkMaterialTypeCode); + row.CreateCell(1).SetCellValue(item.Name); + row.CreateCell(2).SetCellValue(item.Code); + row.CreateCell(3).SetCellValue(item.CustomerCode); + row.CreateCell(4).SetCellValue(item.Color); + row.CreateCell(5).SetCellValue(item.Specification); + row.CreateCell(6).SetCellValue(item.Unit); + row.CreateCell(7).SetCellValue(item.Description); + row.CreateCell(8).SetCellValue(item.SupplierCode); + row.CreateCell(9).SetCellValue(item.ExpirationUnit); + row.CreateCell(10).SetCellValue((double)item.ExpirationDate); + row.CreateCell(11).SetCellValue((double)item.ShelfLifeWarningDays); + row.CreateCell(12).SetCellValue((double)item.IsShelfLife); + row.CreateCell(13).SetCellValue(item.BarCode); + + + } + + // 改为写入 MemoryStream 然后转成 byte[] + var memoryStream = new MemoryStream(); + workbook.Write(memoryStream); + // memoryStream.Position = 0; + return memoryStream.ToArray(); // ✅ 直接返回 byte 数组 + } + + + + } + + } } \ No newline at end of file diff --git a/MES_Model/Services/Material/MaterialTypeService.cs b/MES_Model/Services/Material/MaterialTypeService.cs index cfc7c3a..91152a0 100644 --- a/MES_Model/Services/Material/MaterialTypeService.cs +++ b/MES_Model/Services/Material/MaterialTypeService.cs @@ -7,6 +7,13 @@ using MDM.Model.Material.Dto; using MDM.Service; using MDM.Model; using MDM.Repository; +using DOAN.Model.MES.product; +using Infrastructure; +using Microsoft.AspNetCore.Http; +using Microsoft.VisualBasic; +using System.Collections.Generic; +using NPOI.SS.UserModel; +using NPOI.XSSF.UserModel; namespace MDM.Services.Material { /// @@ -86,6 +93,131 @@ namespace MDM.Services.Material //return response; return Update(model, true); } + public int ImportData(IFormFile formFile, string name) + { + using (var stream = formFile.OpenReadStream()) + { + try + { + IWorkbook workbook = new XSSFWorkbook(stream); + ISheet sheet = workbook.GetSheet("物料类型"); + List materialTypes = new List(); + // 遍历每一行 + for (int row = 1; row <= sheet.LastRowNum; row++) + { + IRow currentRow = sheet.GetRow(row); + if (currentRow != null && currentRow.GetCell(0) != null) // 确保行不为空 + { + MaterialType item = new MaterialType(); + + //物料类型名称 + if (currentRow.GetCell(0) != null && currentRow.GetCell(0).CellType == CellType.String) + item.Name = currentRow.GetCell(0).ToString(); + //物料类别编码 + if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String) + item.Code = currentRow.GetCell(1).ToString(); + + //物料类别父级编码 + if (currentRow.GetCell(2) != null && currentRow.GetCell(2).CellType == CellType.String) + item.ParentCode = currentRow.GetCell(2).ToString(); + //状态 Status + if (currentRow.GetCell(3) != null && currentRow.GetCell(3).CellType == CellType.String) + { + string statusstring = currentRow.GetCell(3).ToString(); + if(statusstring == "启用") + { + item.Status = 1; + } + else if (statusstring == "停用") + { + item.Status = 0; + } + + } + //备注 + if (currentRow.GetCell(4) != null && currentRow.GetCell(4).CellType == CellType.String) + item.Remark = currentRow.GetCell(4).ToString(); + + + materialTypes.Add(item); + + } + } + + if (materialTypes.Count == 0) + { + return 0; + } + UseTran2(() => + { + // Context.Deleteable().Where(it => it.RecordDate == RecordDate.Date).ExecuteCommand(); + Context.Insertable(materialTypes).ExecuteCommand(); + }); + return materialTypes.Count; + + } + catch (Exception ex) + { + throw new CustomException("excel文件异常,请详细核对"); + + + } + + + + } + + } + + + public byte[] ExportData() + { + string templatePath = Path.Combine( + Directory.GetCurrentDirectory(), + "wwwroot", + "ImportTemplate", + "MaterialMODEL.xlsx" + ); + + if (!global::System.IO.File.Exists(templatePath)) + { + throw new CustomException("Excel 模板文件不存在"); + } + + List dataList = Context.Queryable() + .Where(it=>it.Status==1) + .ToList(); + + using (var fileStream = new FileStream(templatePath, FileMode.Open, FileAccess.Read)) + { + IWorkbook workbook = WorkbookFactory.Create(fileStream); + ISheet sheet = workbook.GetSheet("物料类型"); + + int startRowIndex = 1; + for (int i = 0; i < dataList.Count; i++) + { + var item = dataList[i]; + IRow row = sheet.GetRow(startRowIndex + i) ?? sheet.CreateRow(startRowIndex + i); + + // 为每个需要数字的单元格设置值,并应用 numberCellStyle + row.CreateCell(0).SetCellValue(item.Name); + + // 以下为字符串类型字段,不需要数字格式 + row.CreateCell(1).SetCellValue(item.Code); + row.CreateCell(2).SetCellValue(item.ParentCode); + row.CreateCell(3).SetCellValue((double)item.Status); + } + + // 改为写入 MemoryStream 然后转成 byte[] + var memoryStream = new MemoryStream(); + workbook.Write(memoryStream); + // memoryStream.Position = 0; + return memoryStream.ToArray(); // ✅ 直接返回 byte 数组 + } + + + + } } } \ No newline at end of file