using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Admin.NET.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Http; using System.Text; using System.Web; using System.ComponentModel; using System.Data; using Microsoft.CodeAnalysis; namespace Admin.NET.Application { /// /// 物料信息表服务 /// [ApiDescriptionSettings("WmsBase", Name = "WmsMaterial", Order = 100)] [Route("api")] public class WmsMaterialService : IWmsMaterialService, IDynamicApiController, ITransient { private readonly IRepository _wmsMaterialRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); private readonly IRepository _wmsMaterialCustomerRep; private readonly IRepository _baseCustomerRep; private readonly IRepository _wmsSubstituteGoodRep; private readonly IRepository _wmsControlRuleDetailRep; private readonly IRepository _wmsMaterialTypeRep; private readonly IRepository _wmsUnitRep; public WmsMaterialService( IRepository wmsMaterialRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService , IRepository wmsMaterialCustomerRep , IRepository baseCustomerRep , IRepository wmsSubstituteGoodRep , IRepository wmsControlRuleDetailRep , IRepository wmsMaterialTypeRep , IRepository wmsUnitRep ) { _wmsMaterialRep = wmsMaterialRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; _wmsMaterialCustomerRep = wmsMaterialCustomerRep; _baseCustomerRep = baseCustomerRep; _wmsSubstituteGoodRep = wmsSubstituteGoodRep; _wmsControlRuleDetailRep = wmsControlRuleDetailRep; _wmsMaterialTypeRep = wmsMaterialTypeRep; _wmsUnitRep = wmsUnitRep; } /// /// 分页查询物料信息 /// /// /// [HttpGet("WmsMaterial/page")] public async Task> Page([FromQuery] WmsMaterialSearch input) { var wmsMaterials = await _wmsMaterialRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.MaterialName), u => u.MaterialName == input.MaterialName) .Where(!string.IsNullOrEmpty(input.MaterialCode), u => u.MaterialCode == input.MaterialCode) .Where(!string.IsNullOrEmpty(input.ErpCode), u => u.ErpCode == input.ErpCode) .Where(!string.IsNullOrEmpty(input.MaterialTypeName), u => u.MaterialTypeName == input.MaterialTypeName) .Where(!string.IsNullOrEmpty(input.MaterialTypeDescr), u => u.MaterialTypeDescr == input.MaterialTypeDescr) .Where(input.MaterialType != null, u => u.MaterialType == input.MaterialType) .Where(!string.IsNullOrEmpty(input.MaterialGroup), u => u.MaterialGroup == input.MaterialGroup) .Where(!string.IsNullOrEmpty(input.ABCClassName), u => u.ABCClassName == input.ABCClassName) .Where(input.ABCClass != null, u => u.ABCClass == input.ABCClass) .Where(!string.IsNullOrEmpty(input.MaterialSpec), u => u.MaterialSpec == input.MaterialSpec) .Where(!string.IsNullOrEmpty(input.InPlaceCode), u => u.InPlaceCode == input.InPlaceCode) .Where(!string.IsNullOrEmpty(input.MaterialUnit), u => u.MaterialUnit == input.MaterialUnit) .Where(!string.IsNullOrEmpty(input.POUnit), u => u.POUnit == input.POUnit) .Where(!string.IsNullOrEmpty(input.Color), u => u.Color == input.Color) .Where(!string.IsNullOrEmpty(input.Weight), u => u.Weight == input.Weight) .Where(input.SNP != null, u => u.SNP == input.SNP) .Where(input.TranslateRate != null, u => u.TranslateRate == input.TranslateRate) .Where(input.BatchRuleId != null, u => u.BatchRuleId == input.BatchRuleId) .Where(input.ControlRuleId != null, u => u.ControlRuleId == input.ControlRuleId) .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled) .Where(!string.IsNullOrEmpty(input.MaterialDesc), u => u.MaterialDesc == input.MaterialDesc) .Where(input.CreatedTime != null, u => u.CreatedTime >= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime <= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime != null, u => u.UpdatedTime >= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime <= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName) .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsMaterials; } /// /// 不分页查询物料信息列表 /// /// 物料信息查询参数 /// (物料信息)实例列表 [HttpGet("WmsMaterial/listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsMaterialSearchNonPage input) { var pMaterialName = input.MaterialName?.Trim() ?? ""; var pMaterialCode = input.MaterialCode?.Trim() ?? ""; var pErpCode = input.ErpCode?.Trim() ?? ""; var pMaterialTypeName = input.MaterialTypeName?.Trim() ?? ""; var pMaterialTypeDescr = input.MaterialTypeDescr?.Trim() ?? ""; var pMaterialType = input.MaterialType; var pMaterialGroup = input.MaterialGroup?.Trim() ?? ""; var pABCClassName = input.ABCClassName?.Trim() ?? ""; var pABCClass = input.ABCClass; var pMaterialSpec = input.MaterialSpec?.Trim() ?? ""; var pInPlaceCode = input.InPlaceCode?.Trim() ?? ""; var pMaterialUnit = input.MaterialUnit?.Trim() ?? ""; var pPOUnit = input.POUnit?.Trim() ?? ""; var pColor = input.Color?.Trim() ?? ""; var pWeight = input.Weight?.Trim() ?? ""; var pSNP = input.SNP; var pTranslateRate = input.TranslateRate; var pBatchRuleId = input.BatchRuleId; var pControlRuleId = input.ControlRuleId; var pIsDisabled = input.IsDisabled; var pMaterialDesc = input.MaterialDesc?.Trim() ?? ""; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsMaterials = await _wmsMaterialRep.DetachedEntities .Where(!string.IsNullOrEmpty(pMaterialName), u => u.MaterialName == pMaterialName) .Where(!string.IsNullOrEmpty(pMaterialCode), u => u.MaterialCode == pMaterialCode) .Where(!string.IsNullOrEmpty(pErpCode), u => u.ErpCode == pErpCode) .Where(!string.IsNullOrEmpty(pMaterialTypeName), u => u.MaterialTypeName == pMaterialTypeName) .Where(!string.IsNullOrEmpty(pMaterialTypeDescr), u => u.MaterialTypeDescr == pMaterialTypeDescr) .Where(pMaterialType != null, u => u.MaterialType == pMaterialType) .Where(!string.IsNullOrEmpty(pMaterialGroup), u => u.MaterialGroup == pMaterialGroup) .Where(!string.IsNullOrEmpty(pABCClassName), u => u.ABCClassName == pABCClassName) .Where(pABCClass != null, u => u.ABCClass == pABCClass) .Where(!string.IsNullOrEmpty(pMaterialSpec), u => u.MaterialSpec == pMaterialSpec) .Where(!string.IsNullOrEmpty(pInPlaceCode), u => u.InPlaceCode == pInPlaceCode) .Where(!string.IsNullOrEmpty(pMaterialUnit), u => u.MaterialUnit == pMaterialUnit) .Where(!string.IsNullOrEmpty(pPOUnit), u => u.POUnit == pPOUnit) .Where(!string.IsNullOrEmpty(pColor), u => u.Color == pColor) .Where(!string.IsNullOrEmpty(pWeight), u => u.Weight == pWeight) .Where(pSNP != null, u => u.SNP == pSNP) .Where(pTranslateRate != null, u => u.TranslateRate == pTranslateRate) .Where(pBatchRuleId != null, u => u.BatchRuleId == pBatchRuleId) .Where(pControlRuleId != null, u => u.ControlRuleId == pControlRuleId) .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled) .Where(!string.IsNullOrEmpty(pMaterialDesc), u => u.MaterialDesc == pMaterialDesc) .Where(input.CreatedTime != null, u => u.CreatedTime >= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime <= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime != null, u => u.UpdatedTime >= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime <= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName) .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName) .OrderBy(PageInputOrder.OrderNonPageBuilder(input)) .ProjectToType() .ToListAsync(); return wmsMaterials; } /// /// 获取物料信息 /// /// /// [HttpGet("WmsMaterial/detail")] public async Task Get([FromQuery] QueryeWmsMaterialInput input) { WmsMaterialInfoOutput resultInfo = new WmsMaterialInfoOutput(); //获取物料信息 var wmsMaterialInfo =(await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); //获取替换物料信息 var wmsSubstituteGoods = await _wmsSubstituteGoodRep.DetachedEntities .Where(u => u.MaterialCode == wmsMaterialInfo.MaterialCode) .Where(u => u.IsDeleted == false) .Where(u => u.IsDisabled == false) .OrderBy(o => o.CreatedTime) .ProjectToType() .ToListAsync(); //获取控制属性规则 var wmsControlRuleDetails = await _wmsControlRuleDetailRep.DetachedEntities .Where(u => u.Id == wmsMaterialInfo.ControlRuleId) .Where(u => u.IsDeleted == false) .Where(u => u.IsDisabled == false) .OrderBy(o=>o.CreatedTime) .ProjectToType() .ToListAsync(); //物料客户关联 var wmsMaterialCustomerList = await _wmsMaterialCustomerRep.DetachedEntities .Where(u => u.MaterialId == wmsMaterialInfo.Id) .Where(u => u.IsDeleted == false) .OrderBy(o => o.CreatedTime) .ProjectToType() .ToListAsync(); List custIds = wmsMaterialCustomerList.Select(s => s.CustId).ToList(); //根据物料客户关联表获取往来信息 var baseCustomers = await _baseCustomerRep.DetachedEntities .Where(p => custIds.Contains(p.Id)) .OrderBy(o => o.CreatedTime) .ProjectToType() .ToListAsync(); resultInfo.MaterialInfo = wmsMaterialInfo; resultInfo.SubstituteGoodList = wmsSubstituteGoods; resultInfo.ControlRuleDetailList = wmsControlRuleDetails; resultInfo.BaseCustomerList = baseCustomers; return resultInfo; } /// /// 获取物料信息列表 /// /// /// [HttpGet("WmsMaterial/list")] public async Task> List([FromQuery] WmsMaterialInput input) { return await _wmsMaterialRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加物料信息表 /// /// /// [HttpPost("WmsMaterial/add")] [UnitOfWork] public async Task Add(AddWmsMaterialInfoInput input) { //物料信息 var wmsMaterial = input.MaterialInput.Adapt(); //控制规则信息 var controlRuleld = input.ControlRuleld; wmsMaterial.ControlRuleId = controlRuleld; //获取物料类型 var wmsMaterialType = (await _wmsMaterialTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == wmsMaterial.MaterialType && u.IsDeleted == false)).Adapt(); if(wmsMaterialType==null) throw Oops.Oh($"ID{wmsMaterial.MaterialType}物料类型不存在"); wmsMaterial.MaterialTypeName = wmsMaterialType.MaterialTypeName; //往来单位 var wmsBaseCustomerList = await _baseCustomerRep.DetachedEntities.Where(u => input.BaseCustomerList.Contains(u.Id) && u.IsDeleted == false).ProjectToType().ToListAsync(); if (wmsBaseCustomerList?.Count()<=0) { throw Oops.Oh($"往来单位不存在"); } //物料客户关联关系 var materialCustomerList=new List(); foreach (var baseCustomer in wmsBaseCustomerList) { if (baseCustomer.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的往来单位"); } materialCustomerList.Add(new WmsMaterialCustomer() { CreatedTime = DateTime.Now, CreatedUserId = CurrentUserInfo.UserId, CreatedUserName = CurrentUserInfo.Name, CustChinaName = baseCustomer.CustChinaName, CustCode = baseCustomer.CustCode, CustEnglishName = baseCustomer.CustEnglishName, CustId = baseCustomer.Id, MaterialCode = wmsMaterial.MaterialCode, MaterialId = wmsMaterial.Id, MaterialName = wmsMaterial.MaterialName, UpdatedTime = DateTime.Now, UpdatedUserId = CurrentUserInfo.UserId, UpdatedUserName = CurrentUserInfo.Name }); } //验证 await CheckExisit(wmsMaterial); //替代品信息 var substituteGoodList = input.SubstituteGoodList.Adapt>(); List materialCodes = substituteGoodList.Select(s => s.SubstituteMaterialCode).ToList(); var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.DetachedEntities.Where(u => materialCodes.Contains(u.MaterialCode) && u.IsDeleted == false).ProjectToType().ToListAsync(); if (wmsSubstituteMaterialInfoList?.Count <= 0) { throw Oops.Oh($"替代品物料不存在"); } foreach (var item in substituteGoodList) { if (item.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的替代品物料"); } var substituteMaterialInfo = wmsSubstituteMaterialInfoList.FirstOrDefault(f=>f.MaterialCode== item.SubstituteMaterialCode); item.SubstituteCode = await SerialUtil.GetSerial(EnumSerialType.替代品编号); item.SubstituteMaterialName = substituteMaterialInfo.MaterialName;//替代品物料名称 } wmsMaterial.UpdatedUserId = SysHelper.GetUserId(); wmsMaterial.UpdatedUserName = SysHelper.GetUserName(); wmsMaterial.UpdatedTime = SysHelper.GetNowTime(); await _wmsMaterialRep.InsertAsync(wmsMaterial); if (materialCustomerList?.Count > 0) { await _wmsMaterialCustomerRep.InsertAsync(materialCustomerList); } if (substituteGoodList?.Count > 0) { await _wmsSubstituteGoodRep.InsertAsync(substituteGoodList); } } /// /// 删除物料信息 /// /// /// [HttpPost("WmsMaterial/delete")] public async Task Delete(DeleteWmsMaterialInput input) { var wmsMaterial = await _wmsMaterialRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsMaterialRep.DeleteAsync(wmsMaterial); } /// /// 更新物料信息 /// /// /// [HttpPost("WmsMaterial/edit")] [UnitOfWork] public async Task Update(UpdateWmsMaterialInfoInput input) { //物料信息 var wmsMaterial = input.MaterialInput.Adapt(); var isExist = await _wmsMaterialRep.AnyAsync(u => u.Id == wmsMaterial.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); //验证 await CheckExisit(wmsMaterial, true); //控制规则信息 var controlRuleld = input.ControlRuleld; wmsMaterial.ControlRuleId = controlRuleld; //获取物料类型 var wmsMaterialType = (await _wmsMaterialTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == wmsMaterial.MaterialType && u.IsDeleted == false)).Adapt(); if (wmsMaterialType == null) throw Oops.Oh($"ID{wmsMaterial.MaterialType}物料类型不存在"); wmsMaterial.MaterialTypeName = wmsMaterialType.MaterialTypeName; //删除物料客户关联关系 var oldaterialCustomerList = await _wmsMaterialCustomerRep.DetachedEntities.Where(w => w.MaterialId == wmsMaterial.Id).ToListAsync(); if (oldaterialCustomerList?.Count > 0) { await _wmsMaterialCustomerRep.DeleteAsync(oldaterialCustomerList); } //往来单位 var wmsBaseCustomerList = await _baseCustomerRep.DetachedEntities.Where(u => input.BaseCustomerList.Contains(u.Id) && u.IsDeleted == false).ProjectToType().ToListAsync(); if (wmsBaseCustomerList?.Count() <= 0) { throw Oops.Oh($"往来单位不存在"); } //物料客户关联关系 var materialCustomerList = new List(); foreach (var baseCustomer in wmsBaseCustomerList) { if (baseCustomer.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的往来单位"); } materialCustomerList.Add(new WmsMaterialCustomer() { CreatedTime = DateTime.Now, CreatedUserId = CurrentUserInfo.UserId, CreatedUserName = CurrentUserInfo.Name, CustChinaName = baseCustomer.CustChinaName, CustCode = baseCustomer.CustCode, CustEnglishName = baseCustomer.CustEnglishName, CustId = baseCustomer.Id, MaterialCode = wmsMaterial.MaterialCode, MaterialId = wmsMaterial.Id, MaterialName = wmsMaterial.MaterialName, UpdatedTime = DateTime.Now, UpdatedUserId = CurrentUserInfo.UserId, UpdatedUserName = CurrentUserInfo.Name }); } //删除替代品信息 var oldSubstituteGoodList = await _wmsSubstituteGoodRep.DetachedEntities.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(); var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.DetachedEntities.Where(u => materialCodes.Contains(u.MaterialCode)&&u.IsDeleted==false).ProjectToType().ToListAsync(); if (wmsSubstituteMaterialInfoList?.Count <= 0) { throw Oops.Oh($"替代品物料不存在"); } foreach (var item in substituteGoodList) { if (item.IsDisabled == true) { throw Oops.Oh($"不能使用已禁用的替代品物料"); } var substituteMaterialInfo = wmsSubstituteMaterialInfoList.FirstOrDefault(f => f.MaterialCode == item.SubstituteMaterialCode); item.SubstituteCode = await SerialUtil.GetSerial(EnumSerialType.替代品编号); item.SubstituteMaterialName = substituteMaterialInfo.MaterialName;//替代品物料名称 } if (materialCustomerList?.Count > 0) { await _wmsMaterialCustomerRep.InsertAsync(materialCustomerList); } if (substituteGoodList?.Count > 0) { await _wmsSubstituteGoodRep.InsertAsync(substituteGoodList); } wmsMaterial.UpdatedUserId = SysHelper.GetUserId(); wmsMaterial.UpdatedUserName = SysHelper.GetUserName(); wmsMaterial.UpdatedTime = SysHelper.GetNowTime(); await _wmsMaterialRep.UpdateAsync(wmsMaterial, ignoreNullValues: true); } #endregion #region 导入 /// /// Excel模板导入物料信息功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("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); lock (_lock) { _wmsMaterialRep.InsertAsync(addList); } await Task.CompletedTask; 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 WmsMaterial() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _MaterialName = "";//物料名称 var _MaterialCode = "";//物料编号 var _ErpCode = "";//ERP编号 var _MaterialType = "";//物料类型 var _MaterialGroup = "";//物料组 var _ABCClass = "";//ABC分类 var _MaterialSpec = "";//物料规格 var _InPlaceCode = "";//默认入库库位 var _MaterialUnit = "";//库存单位 var _POUnit = "";//采购单位 var _Color = "";//颜色 var _Weight = "";//重量 var _SNP = "";//标包数量 var _TranslateRate = "";//换算率 var _BatchRuleId = "";//批次属性规则 var _ControlRuleId = "";//控制属性规则 var _IsDisabled = "";//是否禁用 var _MaterialDesc = "";//描述 var _Id = "";//Id主键 #endregion #region 取值 _MaterialName = row["物料名称"]?.ToString(); _MaterialCode = row["物料编号"]?.ToString(); _ErpCode = row["ERP编号"]?.ToString(); _MaterialType = row["物料类型"]?.ToString(); _MaterialGroup = row["物料组"]?.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(); _Id = row["Id主键"]?.ToString(); #endregion #region 验证 if (string.IsNullOrEmpty(_MaterialName)) { throw Oops.Oh($"第{index}行[物料名称]{_MaterialName}不能为空!"); } if (!string.IsNullOrEmpty(_MaterialName)) { addItem.MaterialName = (string)_MaterialName; } if (string.IsNullOrEmpty(_MaterialCode)) { throw Oops.Oh($"第{index}行[物料编号]{_MaterialCode}不能为空!"); } if (!string.IsNullOrEmpty(_MaterialCode)) { addItem.MaterialCode = (string)_MaterialCode; } if (!string.IsNullOrEmpty(_ErpCode)) { addItem.ErpCode = (string)_ErpCode; } if (string.IsNullOrEmpty(_MaterialType)) { throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}不能为空!"); } if (!string.IsNullOrEmpty(_MaterialType)) { //TODO 根据物料类型ID获取物料类型 addItem.MaterialType = 0; addItem.MaterialTypeName = ""; } if (!string.IsNullOrEmpty(_MaterialGroup)) { addItem.MaterialGroup = (string)_MaterialGroup; } if (!string.IsNullOrEmpty(_ABCClass)) { Admin.NET.Core.ABCClassEnum enumABCClass = default(Admin.NET.Core.ABCClassEnum); if (!Enum.TryParse < Admin.NET.Core.ABCClassEnum > (_ABCClass, out enumABCClass)&& !string.IsNullOrEmpty(_ABCClass)) { throw Oops.Oh($"第{index}行[ABC分类]{_ABCClass}值不正确!"); } else { addItem.ABCClass = enumABCClass; } } if (!string.IsNullOrEmpty(_MaterialSpec)) { addItem.MaterialSpec = (string)_MaterialSpec; } if (!string.IsNullOrEmpty(_InPlaceCode)) { addItem.InPlaceCode = (string)_InPlaceCode; } if (!string.IsNullOrEmpty(_MaterialUnit)) { addItem.MaterialUnit = (string)_MaterialUnit; } if (!string.IsNullOrEmpty(_POUnit)) { addItem.POUnit = (string)_POUnit; } if (!string.IsNullOrEmpty(_Color)) { addItem.Color = (string)_Color; } if (!string.IsNullOrEmpty(_Weight)) { addItem.Weight = (string)_Weight; } 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)) { 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(_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; } if (!string.IsNullOrEmpty(_Id)) { if (!long.TryParse(_Id, out long outId) && !string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!"); } if (outId <= 0 && !string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!"); } else { addItem.Id = outId; } } #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载物料信息的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [HttpGet("WmsMaterial/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsMaterial{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 }; } #endregion #region 私有方法 /// /// 根据联合主键验证数据是否已存在-数据库 /// /// /// /// private async Task CheckExisit(WmsMaterial input, bool isEdit = false) { bool isExist = false; if (!isEdit)//新增 { //物料编号是否存在重复 isExist = await _wmsMaterialRep.AnyAsync(u => u.MaterialCode.Equals(input.MaterialCode) , false); //物料名称是否存在重复 isExist = await _wmsMaterialRep.AnyAsync(u => u.MaterialName.Equals(input.MaterialName) , false); } else//编辑 { //当前编辑物料编号以外是否存在重复 isExist = await _wmsMaterialRep.AnyAsync(u => u.Id != input.Id && u.MaterialCode.Equals(input.MaterialCode) , false); //当前编辑物料名称以外是否存在重复 isExist = await _wmsMaterialRep.AnyAsync(u => u.Id != input.Id && u.MaterialName.Equals(input.MaterialName) , false); } if (isExist) throw Oops.Oh(ErrorCode.E0001); } /// /// 根据联合主键验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { //根据联合主键验证表格中中是否已存在相同数据 if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //数据是否重复 var existExcelItem = inputs.GroupBy(g => new { g.MaterialCode }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.MaterialCode }).FirstOrDefault(); if (existExcelItem != null) { var wmsMaterial = existExcelItem.Adapt(); var item = existExcelItem.Adapt(); throw Oops.Oh($"导入的表格中,物料编号[{item.MaterialCode}]已存在"); } var existExcelItem2 = inputs.GroupBy(g => new { g.MaterialName }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.MaterialName }).FirstOrDefault(); if (existExcelItem2 != null) { var wmsMaterial = existExcelItem2.Adapt(); var item = existExcelItem2.Adapt(); throw Oops.Oh($"导入的表格中,物料名称[{item.MaterialName}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem = await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(w => inputs.Select(s => "" + s.MaterialCode ) .Contains("" + w.MaterialCode )); if (existDBItem != null) { var wmsMaterial = existExcelItem.Adapt(); var item = existExcelItem.Adapt(); throw Oops.Oh($"系统中,物料编号[{item.MaterialCode}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem2 = await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(w => inputs.Select(s => "" + s.MaterialName ) .Contains("" + w.MaterialName )); if (existDBItem2 != null) { var wmsMaterial = existExcelItem2.Adapt(); var item = existExcelItem.Adapt(); throw Oops.Oh($"系统中,物料编号[{item.MaterialName}]已存在"); } } #endregion } }