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; 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 _wmsSubstituteGoodRep; public WmsMaterialService( IRepository wmsMaterialRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService , IRepository wmsMaterialCustomerRep , IRepository wmsSubstituteGoodRep ) { _wmsMaterialRep = wmsMaterialRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; _wmsMaterialCustomerRep = wmsMaterialCustomerRep; _wmsSubstituteGoodRep = wmsSubstituteGoodRep; } /// /// 分页查询物料信息表 /// /// /// [HttpGet("WmsMaterial/page")] public async Task> Page([FromQuery] WmsMaterialSearch input) { var wmsMaterials = await _wmsMaterialRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.MaterialName), u => EF.Functions.Like(u.MaterialName, $"%{input.MaterialName.Trim()}%")) .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 => EF.Functions.Like(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) { return (await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取物料信息表列表 /// /// /// [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 baseCustomerList = input.BaseCustomerList.Adapt>(); //物料客户关联关系 var materialCustomerList=new List(); foreach (var baseCustomer in baseCustomerList) { 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>(); wmsMaterial.CreatedUserId = wmsMaterial.UpdatedUserId = SysHelper.GetUserId(); wmsMaterial.CreatedUserName = wmsMaterial.UpdatedUserName = SysHelper.GetUserName(); wmsMaterial.CreatedTime = wmsMaterial.UpdatedTime = SysHelper.GetNowTime(); await _wmsMaterialRep.InsertAsync(wmsMaterial); await _wmsMaterialCustomerRep.InsertAsync(materialCustomerList); 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")] public async Task Update(UpdateWmsMaterialInput input) { var isExist = await _wmsMaterialRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsMaterial = input.Adapt(); //验证 await CheckExisit(wmsMaterial,true); 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 _MaterialTypeName = "";//物料类型名称 var _MaterialTypeDescr = "";//物料类型描述 var _MaterialType = "";//物料类型 var _MaterialGroup = "";//物料组 var _ABCClassName = "";//ABC分类名称 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() ; _MaterialTypeName = row["物料类型名称"]?.ToString() ; _MaterialTypeDescr = row["物料类型描述"]?.ToString() ; _MaterialType = row["物料类型"]?.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() ; _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(_MaterialTypeName)) { addItem.MaterialTypeName = (string)_MaterialTypeName; } if(!string.IsNullOrEmpty(_MaterialTypeDescr)) { addItem.MaterialTypeDescr = (string)_MaterialTypeDescr; } if(!string.IsNullOrEmpty(_MaterialType)) { if (!int.TryParse(_MaterialType, out int outMaterialType)&&!string.IsNullOrEmpty(_MaterialType)) { throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}值不正确!"); } if (outMaterialType <= 0&&!string.IsNullOrEmpty(_MaterialType)) { throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}值不能小于等于0!"); } else { addItem.MaterialType = outMaterialType; } } if(!string.IsNullOrEmpty(_MaterialGroup)) { addItem.MaterialGroup = (string)_MaterialGroup; } if(!string.IsNullOrEmpty(_ABCClassName)) { addItem.ABCClassName = (string)_ABCClassName; } if(!string.IsNullOrEmpty(_ABCClass)) { if (!int.TryParse(_ABCClass, out int outABCClass)&&!string.IsNullOrEmpty(_ABCClass)) { throw Oops.Oh($"第{index}行[ABC分类]{_ABCClass}值不正确!"); } if (outABCClass <= 0&&!string.IsNullOrEmpty(_ABCClass)) { throw Oops.Oh($"第{index}行[ABC分类]{_ABCClass}值不能小于等于0!"); } else { // addItem.ABCClass = outABCClass; } } 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(_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)) { 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); } else//编辑 { //当前编辑数据以外是否存在重复 isExist = await _wmsMaterialRep.AnyAsync(u => u.Id != input.Id &&u.MaterialCode.Equals(input.MaterialCode) ,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 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}]已存在"); } } #endregion } }