using Admin.NET.Core.Service; using Admin.NET.Application.Entity; using Microsoft.AspNetCore.Http; using AngleSharp.Dom; using Furion.DatabaseAccessor; using DocumentFormat.OpenXml.Vml.Spreadsheet; using System.Web; using System.Data; using System.Text; namespace Admin.NET.Application; /// /// 物料信息表服务 /// [ApiDescriptionSettings(ApplicationConst.WmsBaseGroupName, Order = 100)] public class WmsMaterialService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _wmsMaterialRep; private readonly SqlSugarRepository _wmsMaterialTypeRep; private readonly SqlSugarRepository _wmsMaterialCustomerRep; private readonly SqlSugarRepository _wmsSubstituteGoodRep; private readonly SqlSugarRepository _baseCustomerRep; private readonly SqlSugarRepository _repRuleDetailRep; private readonly SqlSugarRepository _repSNRep; private readonly SqlSugarRepository _wmsControlRuleDetailrep; private readonly SqlSugarRepository _wmsBatchRuleDetailRep; private readonly SqlSugarRepository _wmsContainerPackagingRep; private readonly SqlSugarRepository _wmsContainerTypeRep; public WmsMaterialService( SqlSugarRepository wmsMaterialRep, SqlSugarRepository wmsMaterialTypeRep, SqlSugarRepository wmsMaterialCustomerRep, SqlSugarRepository wmsSubstituteGoodRep, SqlSugarRepository baseCustomerRep, SqlSugarRepository repRuleDetailRep, SqlSugarRepository wmsBatchRuleDetailRep, SqlSugarRepository repSNRep, SqlSugarRepository wmsControlRuleDetailrep, SqlSugarRepository wmsContainerPackagingRep, SqlSugarRepository wmsContainerTypeRep) { _wmsMaterialRep = wmsMaterialRep; _wmsMaterialTypeRep = wmsMaterialTypeRep; _wmsMaterialCustomerRep = wmsMaterialCustomerRep; _wmsSubstituteGoodRep = wmsSubstituteGoodRep; _baseCustomerRep = baseCustomerRep; _repRuleDetailRep = repRuleDetailRep; _repSNRep = repSNRep; _wmsBatchRuleDetailRep= wmsBatchRuleDetailRep; _wmsControlRuleDetailrep = wmsControlRuleDetailrep; _wmsContainerPackagingRep = wmsContainerPackagingRep; _wmsContainerTypeRep = wmsContainerTypeRep; } /// /// 分页查询物料信息表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] public async Task> Page(WmsMaterialInput input) { var query = _wmsMaterialRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.MaterialName.Contains(input.SearchKey.Trim()) || u.MaterialCode.Contains(input.SearchKey.Trim()) || u.ErpCode.Contains(input.SearchKey.Trim()) || u.MaterialGroup.Contains(input.SearchKey.Trim()) ) .WhereIF(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled) .WhereIF(input.IsCheck.HasValue, u => u.IsCheck == input.IsCheck) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialName), u => u.MaterialName.Contains(input.MaterialName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), u => u.MaterialCode.Contains(input.MaterialCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpCode), u => u.ErpCode.Contains(input.ErpCode.Trim())) .WhereIF(input.MaterialType > 0, u => u.MaterialType == input.MaterialType) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialGroup), u => u.MaterialGroup.Contains(input.MaterialGroup.Trim())) .WhereIF(input.ABCClass>0, u => u.ABCClass == input.ABCClass) .Select(); return await query .OrderBy(x => x.MaterialCode) //.OrderBuilder(input) .ToPagedListAsync(input.Page, input.PageSize); } /// /// 增加物料信息表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [UnitOfWork] public async Task Add(AddWmsMaterialInfoInput input) { var wmsMaterialId = Yitter.IdGenerator.YitIdHelper.NextId(); //物料信息 var wmsMaterial = input.MaterialInput.Adapt(); wmsMaterial.Id= wmsMaterialId; //验证是否已存在相同物料号、物料名称的数据 await CheckExisit(wmsMaterial); //ABCClassName赋值 if (wmsMaterial.ABCClass != null) { wmsMaterial.ABCClassName = GetEnumDescriptionUtil.GetEnumDescription(wmsMaterial.ABCClass); //ly-0718 ABC分类 修改描述,所有页面展示描述 ,不再展示ABC //wmsMaterial.ABCClassName = wmsMaterial.ABCClass.ToString(); } if (wmsMaterial.POUnit != wmsMaterial.MaterialUnit && !wmsMaterial.TranslateRate.HasValue) { throw Oops.Oh($"采购单位{wmsMaterial.POUnit}跟库存单位{wmsMaterial.MaterialUnit}不一致,换算率不能为空"); } //批次规则信息 List batchRuleDetailList = null; if (!string.IsNullOrWhiteSpace(input.BatchRuleCode)) { batchRuleDetailList = await _wmsBatchRuleDetailRep.GetListAsync(u => u.RuleCode == input.BatchRuleCode&&u.IsDelete==false&& u.IsDisabled == false); if (batchRuleDetailList?.Count<=0) { throw Oops.Oh(@$"编号{input.BatchRuleCode}可用批次规则信息不存在!"); } wmsMaterial.BatchRuleCode = input.BatchRuleCode; } //控制规则信息 WmsBaseControlRule controlRuleDetail = null; if (input.ControlRuleDetailInput != null) { //控制规则信息 controlRuleDetail = input.ControlRuleDetailInput.Adapt(); controlRuleDetail.MaterialCode = wmsMaterial.MaterialCode; if (controlRuleDetail.Id > 0) { //存在就更新 await _wmsControlRuleDetailrep.AsUpdateable(controlRuleDetail).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } else { controlRuleDetail.Id = Yitter.IdGenerator.YitIdHelper.NextId(); //不存在就新增 await _wmsControlRuleDetailrep.InsertAsync(controlRuleDetail); } } //根据控制属性赋值是否质检 if (controlRuleDetail==null) { wmsMaterial.IsCheck = false; } else { if (controlRuleDetail.IsCheck != true)//免检 { wmsMaterial.IsCheck = false; } else { wmsMaterial.IsCheck = true; } } //获取物料类型 var wmsMaterialType = (await _wmsMaterialTypeRep.GetFirstAsync(u => u.Id == wmsMaterial.MaterialType && u.IsDelete == false)); if (wmsMaterialType == null) throw Oops.Oh($"ID{wmsMaterial.MaterialType}没有获取到物料类型"); wmsMaterial.MaterialTypeCode = wmsMaterialType.MaterialTypeCode; wmsMaterial.MaterialTypeName = wmsMaterialType.MaterialTypeName; var materialCustomerList = new List(); //往来单位 if (input.BaseCustomerList?.Count > 0) { var wmsBaseCustomerList = await _baseCustomerRep.AsQueryable().Where(u => input.BaseCustomerList.Contains(u.Id) && u.IsDelete == false).Select().ToListAsync(); if (wmsBaseCustomerList?.Count() <= 0) { throw Oops.Oh($"往来单位不存在"); } if (wmsBaseCustomerList?.Count > 0) { //物料客户关联关系 foreach (var item in input.BaseCustomerList) { var baseCustomer = wmsBaseCustomerList.FirstOrDefault(f => f.Id == item); if (baseCustomer == null) { throw Oops.Oh(errorMessage: @$"ID{item}往来单位不存在!"); } if (baseCustomer.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的往来单位"); } materialCustomerList.Add(new WmsBaseMaterialCustomer() { CustChinaName = baseCustomer.CustChinaName, CustCode = baseCustomer.CustCode, CustEnglishName = baseCustomer.CustEnglishName, CustId = baseCustomer.Id, MaterialCode = wmsMaterial.MaterialCode, MaterialId = wmsMaterial.Id, MaterialName = wmsMaterial.MaterialName, }); } } } //替代品信息 var substituteGoodList = input.SubstituteGoodList.Adapt>(); List materialCodes = substituteGoodList.Select(s => s.SubstituteMaterialCode).ToList(); if (materialCodes?.Count > 0) { var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.AsQueryable().Where(u => materialCodes.Contains(u.MaterialCode) && u.IsDelete == false).Select().ToListAsync(); if (wmsSubstituteMaterialInfoList?.Count <= 0) { throw Oops.Oh($"替代品物料不存在"); } foreach (var item in substituteGoodList) { var substituteMaterialInfo = wmsSubstituteMaterialInfoList.FirstOrDefault(f => f.MaterialCode == item.SubstituteMaterialCode); if (substituteMaterialInfo == null) { throw Oops.Oh(errorMessage: @$"替代品物料{item.SubstituteMaterialCode}不存在!"); } if (substituteMaterialInfo.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的替代品物料"); } item.SubstituteCode = await SerialUtil.GetSerial(SerialTypeEnum.替代品编号, _repRuleDetailRep, _repSNRep); item.SubstituteMaterialName = substituteMaterialInfo.MaterialName;//替代品物料名称 item.MaterialCode = wmsMaterial.MaterialCode;//原物料编号 item.MaterialName= wmsMaterial.MaterialName;//原物料名称 } } //物料容器关系 var containerPackagingList = input.ContainerPackagingList.Adapt>(); List wmsContainerTypeIds= containerPackagingList.Where(w => w.ContainerTypeId > 0).Select(x => x.ContainerTypeId).ToList(); if (wmsContainerTypeIds?.Count > 0) { var wmsContainerTypeList = await _wmsContainerTypeRep.AsQueryable().Where(u => wmsContainerTypeIds.Contains(u.Id) && u.IsDelete == false).Select().ToListAsync(); if (wmsContainerTypeList?.Count <= 0) { throw Oops.Oh($"容器类型不存在"); } foreach (var item in containerPackagingList) { var wmsContainerType = wmsContainerTypeList.FirstOrDefault(f => f.Id == item.ContainerTypeId); if (wmsContainerType == null) { throw Oops.Oh($"容器类型不存在"); } if (wmsContainerType.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的容器类型"); } item.ContainerTypeId = wmsContainerType.Id; item.ContainerTypeCode = wmsContainerType.TypeCode; item.ContainerTypeName = wmsContainerType.TypeName; item.MaterialId = wmsMaterial.Id; item.MaterialCode = wmsMaterial.MaterialCode; item.MaterialName = wmsMaterial.MaterialName; } } //新增物料 await _wmsMaterialRep.InsertAsync(wmsMaterial); //新增 物料客户关系 if (materialCustomerList?.Count > 0) { await _wmsMaterialCustomerRep.InsertRangeAsync(materialCustomerList); } //新增替代品 if (substituteGoodList?.Count > 0) { await _wmsSubstituteGoodRep.InsertRangeAsync(substituteGoodList); } //新增物料容器类型关系 if (containerPackagingList?.Count > 0) { await _wmsContainerPackagingRep.InsertRangeAsync(containerPackagingList); } return wmsMaterial.Id; } /// /// 删除物料信息表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] public async Task Delete(DeleteWmsMaterialInput input) { var entity = await _wmsMaterialRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); //删除物料容器关系 var oldContainerPackagingList = await _wmsContainerPackagingRep.AsQueryable().Where(w => w.MaterialId == input.Id).ToListAsync(); //物料客户关联 var wmsMaterialCustomerList = await _wmsMaterialCustomerRep.AsQueryable().Where(u => u.MaterialId == entity.Id).ToListAsync(); //删除替代品信息 var oldSubstituteGoodList = await _wmsSubstituteGoodRep.AsQueryable().Where(w => w.MaterialCode == entity.MaterialCode).ToListAsync(); //删除控制属性 var oldControlRuleDetailList = await _wmsControlRuleDetailrep.AsQueryable().Where(w => w.MaterialCode == entity.MaterialCode).ToListAsync(); try { await _wmsMaterialRep.AsTenant().BeginTranAsync(); if (oldContainerPackagingList?.Count > 0) { await _wmsContainerPackagingRep.DeleteAsync(oldContainerPackagingList); } // 物料客户关联关系 if (wmsMaterialCustomerList?.Count > 0) { await _wmsMaterialCustomerRep.DeleteAsync(wmsMaterialCustomerList); } //删除替代品信息 if (oldSubstituteGoodList?.Count > 0) { await _wmsSubstituteGoodRep.DeleteAsync(oldSubstituteGoodList); } //删除控制属性 if (oldControlRuleDetailList?.Count > 0) { await _wmsControlRuleDetailrep.DeleteAsync(oldControlRuleDetailList); } await _wmsMaterialRep.DeleteAsync(entity); //真删除 await _wmsMaterialRep.AsTenant().CommitTranAsync(); } catch { await _wmsMaterialRep.AsTenant().RollbackTranAsync(); throw; } } /// /// 更新物料信息表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Update")] [UnitOfWork] public async Task Update(UpdateWmsMaterialInfoInput input) { //物料信息 var wmsMaterial = input.MaterialInput.Adapt(); //验证要修改的物料信息是否存在 var existWmsMaterial = await _wmsMaterialRep.GetFirstAsync(u => u.Id == wmsMaterial.Id && u.IsDelete == false); if (existWmsMaterial==null) throw Oops.Oh($"物料编号[{wmsMaterial.MaterialCode}]物料信息不存在"); //验证是否已存在相同物料号、物料名称的数据 await CheckExisit(wmsMaterial, true); //ABCClassName赋值 if (wmsMaterial.ABCClass != null) { //wmsMaterial.ABCClassName = wmsMaterial.ABCClass.ToString(); wmsMaterial.ABCClassName = GetEnumDescriptionUtil.GetEnumDescription(wmsMaterial.ABCClass); //ly-0718 ABC分类 修改描述,所有页面展示描述 ,不再展示ABC } if (wmsMaterial.POUnit != wmsMaterial.MaterialUnit && !wmsMaterial.TranslateRate.HasValue) { throw Oops.Oh($"采购单位{wmsMaterial.POUnit}跟库存单位{wmsMaterial.MaterialUnit}不一致,换算率不能为空"); } //批次规则信息 List batchRuleDetailList = null; if (!string.IsNullOrWhiteSpace(input.BatchRuleCode)) { batchRuleDetailList = await _wmsBatchRuleDetailRep.GetListAsync(u => u.RuleCode == input.BatchRuleCode && u.IsDelete == false && u.IsDisabled == false); if (batchRuleDetailList?.Count <= 0) { throw Oops.Oh(@$"编号{input.BatchRuleCode}可用批次规则信息不存在!"); } } //批次编号赋值 wmsMaterial.BatchRuleCode = input.BatchRuleCode; //控制规则信息 WmsBaseControlRule controlRuleDetail = null; if (input.ControlRuleDetailInput != null) { //控制规则信息 controlRuleDetail = input.ControlRuleDetailInput.Adapt(); controlRuleDetail.MaterialCode = wmsMaterial.MaterialCode; if (controlRuleDetail.Id > 0) { //存在就更新 await _wmsControlRuleDetailrep.AsUpdateable(controlRuleDetail).ExecuteCommandAsync(); } else { controlRuleDetail.Id =Yitter.IdGenerator.YitIdHelper.NextId(); //不存在就新增 await _wmsControlRuleDetailrep.InsertAsync(controlRuleDetail); } } //根据控制属性赋值是否质检 if (controlRuleDetail == null) { wmsMaterial.IsCheck = false; } else { if (controlRuleDetail.IsCheck != true)//免检 { wmsMaterial.IsCheck = false; } else { wmsMaterial.IsCheck = true; } } //获取物料类型 var wmsMaterialType = (await _wmsMaterialTypeRep.GetFirstAsync(u => u.Id == wmsMaterial.MaterialType && u.IsDelete == false)); if (wmsMaterialType == null) throw Oops.Oh($"ID{wmsMaterial.MaterialType}没有获取到物料类型"); wmsMaterial.MaterialTypeCode = wmsMaterialType.MaterialTypeCode; wmsMaterial.MaterialTypeName = wmsMaterialType.MaterialTypeName; //删除物料客户关联关系_rep.AsQueryable().Select().ToListAsync(); var oldaterialCustomerList = await _wmsMaterialCustomerRep.AsQueryable().Where(w => w.MaterialId == wmsMaterial.Id).ToListAsync(); if (oldaterialCustomerList?.Count > 0) { await _wmsMaterialCustomerRep.DeleteAsync(oldaterialCustomerList); } var materialCustomerList = new List(); if (input.BaseCustomerList?.Count > 0) { //往来单位 var wmsBaseCustomerList = await _baseCustomerRep.AsQueryable().Where(u => input.BaseCustomerList.Contains(u.Id) && u.IsDelete== false).ToListAsync(); if (wmsBaseCustomerList?.Count() <= 0) { throw Oops.Oh($"往来单位不存在"); } if (wmsBaseCustomerList?.Count > 0) { //物料客户关联关系 foreach (var item in input.BaseCustomerList) { var baseCustomer = wmsBaseCustomerList.FirstOrDefault(f => f.Id == item); if (baseCustomer == null) { throw Oops.Oh(errorMessage: @$"ID{item}往来单位不存在!"); } if (baseCustomer.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的往来单位"); } materialCustomerList.Add(new WmsBaseMaterialCustomer() { CustChinaName = baseCustomer.CustChinaName, CustCode = baseCustomer.CustCode, CustEnglishName = baseCustomer.CustEnglishName, CustId = baseCustomer.Id, MaterialCode = wmsMaterial.MaterialCode, MaterialId = wmsMaterial.Id, MaterialName = wmsMaterial.MaterialName, }); } } } //删除替代品信息 var oldSubstituteGoodList = await _wmsSubstituteGoodRep.AsQueryable().Where(w => w.MaterialCode == wmsMaterial.MaterialCode).ToListAsync(); if (oldSubstituteGoodList?.Count > 0) { await _wmsSubstituteGoodRep.DeleteAsync(oldSubstituteGoodList); } //替代品信息 var substituteGoodList = input.SubstituteGoodList.Adapt>(); List materialCodes = substituteGoodList.Select(s => s.SubstituteMaterialCode).ToList(); if (materialCodes?.Count > 0) { var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.AsQueryable().Where(u => materialCodes.Contains(u.MaterialCode) && u.IsDelete == false).ToListAsync(); if (wmsSubstituteMaterialInfoList?.Count <= 0) { throw Oops.Oh($"替代品物料不存在"); } foreach (var item in substituteGoodList) { var substituteMaterialInfo = wmsSubstituteMaterialInfoList.FirstOrDefault(f => f.MaterialCode == item.SubstituteMaterialCode); if (substituteMaterialInfo.IsDisabled == true) { throw Oops.Oh($"替代品物料{substituteMaterialInfo.MaterialCode}已禁用"); } item.SubstituteCode = await SerialUtil.GetSerial(SerialTypeEnum.替代品编号,_repRuleDetailRep,_repSNRep); item.SubstituteMaterialName = substituteMaterialInfo.MaterialName;//替代品物料名称 item.MaterialCode = wmsMaterial.MaterialCode;//原物料编号 item.MaterialName = wmsMaterial.MaterialName;//原物料名称 } } //删除物料容器关系 var oldContainerPackagingList = await _wmsContainerPackagingRep.AsQueryable().Where(w => w.MaterialId == wmsMaterial.Id).ToListAsync(); if (oldContainerPackagingList?.Count > 0) { await _wmsContainerPackagingRep.DeleteAsync(oldContainerPackagingList); } //物料容器关系 var containerPackagingList = input.ContainerPackagingList.Adapt>(); List wmsContainerTypeIds = containerPackagingList.Where(w=>w.ContainerTypeId>0).Select(x => x.ContainerTypeId).ToList(); if (wmsContainerTypeIds?.Count > 0) { var wmsContainerTypeList = await _wmsContainerTypeRep.AsQueryable().Where(u => wmsContainerTypeIds.Contains(u.Id) && u.IsDelete == false).Select().ToListAsync(); if (wmsContainerTypeList?.Count <= 0) { throw Oops.Oh($"容器类型不存在"); } foreach (var item in containerPackagingList) { var wmsContainerType = wmsContainerTypeList.FirstOrDefault(f => f.Id == item.ContainerTypeId); if (wmsContainerType == null) { throw Oops.Oh($"容器类型不存在"); } if (wmsContainerType.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的容器类型"); } item.ContainerTypeId = wmsContainerType.Id; item.ContainerTypeCode = wmsContainerType.TypeCode; item.ContainerTypeName = wmsContainerType.TypeName; item.MaterialId = wmsMaterial.Id; item.MaterialCode = wmsMaterial.MaterialCode; item.MaterialName = wmsMaterial.MaterialName; } } //新增物料客户关联关系 if (materialCustomerList?.Count > 0) { await _wmsMaterialCustomerRep.InsertRangeAsync(materialCustomerList); } //新增替代品信息 if (substituteGoodList?.Count > 0) { await _wmsSubstituteGoodRep.InsertRangeAsync(substituteGoodList); } //新增物料容器类型关系 if (containerPackagingList?.Count > 0) { await _wmsContainerPackagingRep.InsertRangeAsync(containerPackagingList); } await _wmsMaterialRep.AsUpdateable(wmsMaterial).IgnoreColumns(ignoreAllNullColumns: false).ExecuteCommandAsync(); } /// /// 获取物料信息表 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] public async Task Detail([FromQuery] QueryByIdWmsMaterialInput input) { WmsMaterialInfoOutput resultInfo = new WmsMaterialInfoOutput(); //获取物料信息 var wmsMaterialInfo = (await _wmsMaterialRep.GetFirstAsync(u => u.Id == input.Id)).Adapt(); //获取替换物料信息 var wmsSubstituteGoods = await _wmsSubstituteGoodRep.AsQueryable() .Where(u => u.MaterialCode == wmsMaterialInfo.MaterialCode) .Where(u => u.IsDelete == false) .Where(u => u.IsDisabled == false) .OrderBy(o => o.CreateTime) .Select() .ToListAsync(); //批次规则信息 List batchRuleDetailList = await _wmsBatchRuleDetailRep.AsQueryable() .Where(u => u.RuleCode == wmsMaterialInfo.BatchRuleCode) .Where(u => u.IsDelete == false) .Where(u => u.IsDisabled == false) .OrderBy(o => o.CreateTime) .Select() .ToListAsync(); //获取控制属性规则 var wmsControlRuleDetailList = await _wmsControlRuleDetailrep.AsQueryable() .Where(u => u.MaterialCode == wmsMaterialInfo.MaterialCode) .Where(u => u.IsDelete == false) .Where(u => u.IsDisabled == false) .OrderBy(o => o.CreateTime) .Select() .ToListAsync(); //物料客户关联 var wmsMaterialCustomerList = await _wmsMaterialCustomerRep.AsQueryable() .Where(u => u.MaterialId == wmsMaterialInfo.Id) .Where(u => u.IsDelete == false) .OrderBy(o => o.CreateTime) .Select() .ToListAsync(); List custIds = wmsMaterialCustomerList.Select(s => s.CustId).ToList(); //根据物料客户关联表获取往来信息 var baseCustomers = await _baseCustomerRep.AsQueryable() .Where(p => custIds.Contains(p.Id)) .OrderBy(o => o.CreateTime) .Select() .ToListAsync(); var containerPackagingList = await _wmsContainerPackagingRep.AsQueryable().Where(w => w.MaterialId == wmsMaterialInfo.Id).ToListAsync(); resultInfo.MaterialInfo = wmsMaterialInfo; resultInfo.SubstituteGoodList = wmsSubstituteGoods; resultInfo.BatchRuleDetailList = batchRuleDetailList; resultInfo.ControlRuleDetailList = wmsControlRuleDetailList; resultInfo.BaseCustomerList = baseCustomers; resultInfo.ContainerPackagingList = containerPackagingList; return resultInfo; } /// /// 获取物料信息表列表 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] public async Task> List([FromQuery] WmsMaterialInput input) { return await _wmsMaterialRep.AsQueryable().Select().ToListAsync(); } #region 导入 /// /// Excel模板导入物料信息表功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost] [ApiDescriptionSettings(Name = "ImportExcel")] [Description("WmsMaterial/ImportExcel")] public async Task ImportExcelAsync(IFormFile file) { int _HeadStartLine = 2;//第1行是说明,第2行是列名 int _DataStartLine = 3;//第3行开始是数据 DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine); var addList = await CommonImport(importDataTable, _DataStartLine); await _wmsMaterialRep.InsertRangeAsync(addList); return addList.Count; } /// /// DataTable转换实体对象列表 /// /// /// 模版列名开始行 /// private async Task> CommonImport(DataTable dataTable, int dataStartLine) { var details = new List(); int index = dataStartLine;//模版列名开始行 foreach (System.Data.DataRow row in dataTable.Rows) { index++; //导入模版定制化代码(替换模版使用) var addItem = new WmsBaseMaterial(); #region 定义变量 var _MaterialName = "";//物料名称 var _MaterialCode = "";//物料编号 var _ErpCode = "";//ERP编号 var _ABCClassName = "";//ABC分类名称 var _MaterialUnit = "";//库存单位 var _POUnit = "";//采购单位 var _Color = "";//颜色 var _SNP = "";//标包数量 var _TranslateRate = "";//换算率 var _IsDisabled = "";//是否禁用 var _MaterialDesc = "";//描述 var _IsCheck = "";//是否质检 #endregion #region 取值 _MaterialName = row["物料名称"]?.ToString(); _MaterialCode = row["物料编号"]?.ToString(); _ErpCode = row["ERP编号"]?.ToString(); //_MaterialTypeName = row["物料类型名称"]?.ToString(); //_MaterialTypeDescr = row["物料类型描述"]?.ToString(); //_MaterialTypeCode = row["物料类型编号"]?.ToString(); //_MaterialType = row["物料类型ID"]?.ToString(); //_MaterialGroup = row["物料组"]?.ToString(); _ABCClassName = row["ABC分类名称"]?.ToString(); //_ABCClass = row["ABC分类"]?.ToString(); //_MaterialSpec = row["物料规格"]?.ToString(); //_InPlaceCode = row["默认上架库位"]?.ToString(); _MaterialUnit = row["库存单位"]?.ToString(); _POUnit = row["采购单位"]?.ToString(); _Color = row["颜色"]?.ToString(); //_Weight = row["重量"]?.ToString(); _SNP = row["标包数量"]?.ToString(); _TranslateRate = row["换算率"]?.ToString(); //_BatchRuleId = row["批次属性规则"]?.ToString(); //_ControlRuleId = row["控制属性规则"]?.ToString(); _IsDisabled = row["是否禁用"]?.ToString(); _MaterialDesc = row["描述"]?.ToString(); _IsCheck = row["是否质检"]?.ToString(); //_BatchRuleCode = row["批次属性规则编号"]?.ToString(); //_ControlRuleCode = row["控制属性规则编号"]?.ToString(); #endregion #region 验证 if (string.IsNullOrEmpty(_MaterialName)) { throw Oops.Oh($"第{index}行[物料名称]{_MaterialName}不能为空!"); } if (!string.IsNullOrEmpty(_MaterialName)) { addItem.MaterialName = (string)(_MaterialName.Trim()); } if (string.IsNullOrEmpty(_MaterialCode)) { throw Oops.Oh($"第{index}行[物料编号]{_MaterialCode}不能为空!"); } if (!string.IsNullOrEmpty(_MaterialCode)) { var isExist = await _wmsMaterialRep.AsQueryable().FirstAsync(p =>p.MaterialCode == _MaterialCode); if (isExist != null) throw Oops.Oh("该物料编号"+_MaterialCode+"已存在"); addItem.MaterialCode = (string)(_MaterialCode.Trim()); } if (!string.IsNullOrEmpty(_ErpCode)) { addItem.ErpCode = (string)(_ErpCode.Trim()); } addItem.MaterialTypeName = "原材料"; addItem.MaterialTypeCode = "YCL"; addItem.MaterialType = 546896760045637; //if (string.IsNullOrEmpty(_MaterialTypeName)) //{ // throw Oops.Oh($"第{index}行[物料类型名称]{_MaterialTypeName}不能为空!"); //} //if (!string.IsNullOrEmpty(_MaterialTypeName)) //{ // addItem.MaterialTypeName = (string)(_MaterialTypeName.Trim()); //} //if (!string.IsNullOrEmpty(_MaterialTypeDescr)) //{ // addItem.MaterialTypeDescr = (string)(_MaterialTypeDescr.Trim()); //} //if (!string.IsNullOrEmpty(_MaterialTypeCode)) //{ // addItem.MaterialTypeCode = (string)(_MaterialTypeCode.Trim()); //} //if (string.IsNullOrEmpty(_MaterialType)) //{ // throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialType}不能为空!"); //} //if (!string.IsNullOrEmpty(_MaterialType)) //{ // if (!long.TryParse(_MaterialType, out long outMaterialType) && !string.IsNullOrEmpty(_MaterialType)) // { // throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialType}值不正确!"); // } // if (outMaterialType <= 0 && !string.IsNullOrEmpty(_MaterialType)) // { // throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialType}值不能小于等于0!"); // } // else // { // addItem.MaterialType = outMaterialType; // } //} //if (!string.IsNullOrEmpty(_MaterialGroup)) //{ // addItem.MaterialGroup = (string)(_MaterialGroup.Trim()); //} if (!string.IsNullOrEmpty(_ABCClassName)) { addItem.ABCClassName = (string)(_ABCClassName.Trim()); } if (addItem.ABCClassName== "单件高/品类少") { addItem.ABCClass = ABCClassEnum.A; }else if (addItem.ABCClassName == "单件低于A/品类多") { addItem.ABCClass = ABCClassEnum.B; }else if (addItem.ABCClassName == "单价低于B/品类多") { addItem.ABCClass = ABCClassEnum.C; } //if (!string.IsNullOrEmpty(_ABCClass)) //{ // Admin.NET.Application.ABCClassEnum enumABCClass = default(Admin.NET.Application.ABCClassEnum); // if (!Enum.TryParse(_ABCClass, out enumABCClass) && !string.IsNullOrEmpty(_ABCClass)) // { // throw Oops.Oh($"第{index}行[ABC分类]{_ABCClass}值不正确!"); // } // else // { // addItem.ABCClass = enumABCClass; // } //} //if (!string.IsNullOrEmpty(_MaterialSpec)) //{ // addItem.MaterialSpec = (string)(_MaterialSpec.Trim()); //} //if (!string.IsNullOrEmpty(_InPlaceCode)) //{ // addItem.InPlaceCode = (string)(_InPlaceCode.Trim()); //} if (string.IsNullOrEmpty(_MaterialUnit)) { throw Oops.Oh($"第{index}行[库存单位]{_MaterialUnit}不能为空!"); } if (!string.IsNullOrEmpty(_MaterialUnit)) { addItem.MaterialUnit = (string)(_MaterialUnit.Trim()); } if (string.IsNullOrEmpty(_POUnit)) { throw Oops.Oh($"第{index}行[采购单位]{_POUnit}不能为空!"); } if (!string.IsNullOrEmpty(_POUnit)) { addItem.POUnit = (string)(_POUnit.Trim()); } if (!string.IsNullOrEmpty(_Color)) { addItem.Color = (string)(_Color.Trim()); } //if (!string.IsNullOrEmpty(_Weight)) //{ // addItem.Weight = (string)(_Weight.Trim()); //} if (!string.IsNullOrEmpty(_SNP)) { if (!decimal.TryParse(_SNP, out decimal outSNP) && !string.IsNullOrEmpty(_SNP)) { throw Oops.Oh($"第{index}行[标包数量]{_SNP}值不正确!"); } if (outSNP <= 0 && !string.IsNullOrEmpty(_SNP)) { throw Oops.Oh($"第{index}行[标包数量]{_SNP}值不能小于等于0!"); } else { addItem.SNP = outSNP; } } if (string.IsNullOrEmpty(_TranslateRate)) { throw Oops.Oh($"第{index}行[换算率]{_TranslateRate}不能为空!"); } if (!string.IsNullOrEmpty(_TranslateRate)) { if (!decimal.TryParse(_TranslateRate, out decimal outTranslateRate) && !string.IsNullOrEmpty(_TranslateRate)) { throw Oops.Oh($"第{index}行[换算率]{_TranslateRate}值不正确!"); } if (outTranslateRate <= 0 && !string.IsNullOrEmpty(_TranslateRate)) { throw Oops.Oh($"第{index}行[换算率]{_TranslateRate}值不能小于等于0!"); } else { addItem.TranslateRate = outTranslateRate; } } //if (!string.IsNullOrEmpty(_BatchRuleId)) //{ // if (!long.TryParse(_BatchRuleId, out long outBatchRuleId) && !string.IsNullOrEmpty(_BatchRuleId)) // { // throw Oops.Oh($"第{index}行[批次属性规则]{_BatchRuleId}值不正确!"); // } // if (outBatchRuleId <= 0 && !string.IsNullOrEmpty(_BatchRuleId)) // { // throw Oops.Oh($"第{index}行[批次属性规则]{_BatchRuleId}值不能小于等于0!"); // } // else // { // addItem.BatchRuleId = outBatchRuleId; // } //} //if (!string.IsNullOrEmpty(_ControlRuleId)) //{ // if (!long.TryParse(_ControlRuleId, out long outControlRuleId) && !string.IsNullOrEmpty(_ControlRuleId)) // { // throw Oops.Oh($"第{index}行[控制属性规则]{_ControlRuleId}值不正确!"); // } // if (outControlRuleId <= 0 && !string.IsNullOrEmpty(_ControlRuleId)) // { // throw Oops.Oh($"第{index}行[控制属性规则]{_ControlRuleId}值不能小于等于0!"); // } // else // { // addItem.ControlRuleId = outControlRuleId; // } //} if (string.IsNullOrEmpty(_IsDisabled)) { throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}不能为空!"); } if (!string.IsNullOrEmpty(_IsDisabled)) { if (!_IsDisabled.Equals("是") && !_IsDisabled.Equals("否")) { throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}值不正确!"); } else { bool outIsDisabled = _IsDisabled.Equals("是") ? true : false; addItem.IsDisabled = outIsDisabled; } } if (!string.IsNullOrEmpty(_MaterialDesc)) { addItem.MaterialDesc = (string)(_MaterialDesc.Trim()); } if (string.IsNullOrEmpty(_IsCheck)) { throw Oops.Oh($"第{index}行[是否质检]{_IsCheck}不能为空!"); } if (!string.IsNullOrEmpty(_IsCheck)) { if (!_IsCheck.Equals("是") && !_IsCheck.Equals("否")) { throw Oops.Oh($"第{index}行[是否质检]{_IsCheck}值不正确!"); } else { bool outIsCheck = _IsCheck.Equals("是") ? true : false; addItem.IsCheck = outIsCheck; } } //if (!string.IsNullOrEmpty(_BatchRuleCode)) //{ // addItem.BatchRuleCode = (string)(_BatchRuleCode.Trim()); //} //if (!string.IsNullOrEmpty(_ControlRuleCode)) //{ // addItem.ControlRuleCode = (string)(_ControlRuleCode.Trim()); //} #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载物料信息表的Excel导入模板 /// /// 下载的模板文件 [HttpGet] [ApiDescriptionSettings(Name = "DownloadExcelTemplate")] [Description("WmsMaterial/DownloadExcelTemplate")] public IActionResult DownloadExcelTemplate() { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\物料信息表{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx"; var fileName = HttpUtility.UrlEncode($"导入模板(物料信息表).xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } /// /// 根据组合校验和单独校验验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //根据组合校验验证表格中中是否已存在相同数据 //根据单独校验验证表格中中是否已存在相同数据 } #endregion #region 私有方法 /// /// 根据联合主键验证数据是否已存在-数据库 /// /// /// /// private async Task CheckExisit(WmsBaseMaterial input, bool isEdit = false) { //输出数据已存在错误 ErrorCodeItemMetadataAttribute metadata = ErrorCodeEnum.D1006.GetErrorCodeItemMetadata(); WmsBaseMaterial _existItem = null; if (!isEdit)//新增 { _existItem = await _wmsMaterialRep.GetFirstAsync(u => u.MaterialCode.Equals(input.MaterialCode)); if (_existItem != null) throw Oops.Oh($"物料编号[{input.MaterialCode}]{metadata.ErrorMessage}"); _existItem = await _wmsMaterialRep.GetFirstAsync(u => u.MaterialName.Equals(input.MaterialName)); if (_existItem != null) throw Oops.Oh($"物料名称[{input.MaterialName}]{metadata.ErrorMessage}"); } else//编辑 { //当前编辑数据以外是否存在重复 _existItem = await _wmsMaterialRep.GetFirstAsync(u => u.Id != input.Id && u.MaterialCode.Equals(input.MaterialCode)); if (_existItem != null) throw Oops.Oh($"物料编号[{input.MaterialCode}]{metadata.ErrorMessage}"); _existItem = await _wmsMaterialRep.GetFirstAsync(u => u.Id != input.Id && u.MaterialName.Equals(input.MaterialName)); if (_existItem != null) throw Oops.Oh($"物料名称[{input.MaterialName}]{metadata.ErrorMessage}"); } } #endregion }