schangxiang@126.com
2024-04-25 4d14b84903bf0277c5e8b9b3138c5e1d981e95db
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsMaterial/WmsMaterialService.cs
@@ -27,22 +27,26 @@
        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
        private readonly IRepository<WmsMaterialCustomer, MasterDbContextLocator> _wmsMaterialCustomerRep;
        private readonly IRepository<WmsSubstituteGood, MasterDbContextLocator> _wmsSubstituteGoodRep;
        public WmsMaterialService(
            IRepository<WmsMaterial,MasterDbContextLocator> wmsMaterialRep
            ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
            ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
            ,ISysExcelTemplateService sysExcelTemplateService
            , IRepository<WmsMaterialCustomer, MasterDbContextLocator> wmsMaterialCustomerRep
            , IRepository<WmsSubstituteGood, MasterDbContextLocator> wmsSubstituteGoodRep
        )
        {
            _wmsMaterialRep = wmsMaterialRep;
         _sysDictTypeRep = sysDictTypeRep;
         _sysDictDataRep = sysDictDataRep;
         _sysExcelTemplateService = sysExcelTemplateService;
            _wmsMaterialCustomerRep = wmsMaterialCustomerRep;
            _wmsSubstituteGoodRep = wmsSubstituteGoodRep;
        }
        /// <summary>
        /// 分页查询物料信息表
        /// 分页查询物料信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
@@ -50,7 +54,7 @@
        public async Task<PageResult<WmsMaterialOutput>> 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.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)
@@ -71,8 +75,8 @@
                                     .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(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<WmsMaterialSearch>(input))
@@ -82,10 +86,10 @@
        }
        /// <summary>
        /// 不分页查询物料信息表列表
        /// 不分页查询物料信息列表
        /// </summary>
        /// <param name="input">物料信息表查询参数</param>
        /// <returns>(物料信息表)实例列表</returns>
        /// <param name="input">物料信息查询参数</param>
        /// <returns>(物料信息)实例列表</returns>
        [HttpGet("WmsMaterial/listNonPage")]
        public async Task<List<WmsMaterialOutput>> ListNonPageAsync([FromQuery] WmsMaterialSearchNonPage input)
        {
@@ -115,7 +119,7 @@
            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(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)
@@ -136,8 +140,8 @@
                .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(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))
@@ -146,8 +150,8 @@
            return wmsMaterials;
        }
         /// <summary>
        /// 获取物料信息表
        /// <summary>
        /// 获取物料信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
@@ -158,7 +162,7 @@
        }
        /// <summary>
        /// 获取物料信息表列表
        /// 获取物料信息列表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
@@ -177,15 +181,17 @@
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsMaterial/add")]
        [UnitOfWork]
        public async Task Add(AddWmsMaterialInfoInput input)
        {
            //物料信息
            var wmsMaterial = input.MaterialInput.Adapt<WmsMaterial>();
            //控制规则信息
            var controlRuleld = input.ControlRuleld;
            //客户档案信息
            wmsMaterial.ControlRuleId = controlRuleld;
            //往来关系信息
            var baseCustomerList = input.BaseCustomerList.Adapt<List<BaseCustomer>>();
            //物料客户关联关系
            var materialCustomerList=new List<WmsMaterialCustomer>();
@@ -208,22 +214,31 @@
                    UpdatedUserName = CurrentUserInfo.Name
                    
                });
            }
            //替代品信息
            var substituteGoodList = input.SubstituteGoodList.Adapt<List<WmsSubstituteGood>>();
            //验证
            await CheckExisit(wmsMaterial);
            wmsMaterial.CreatedUserId = wmsMaterial.UpdatedUserId = SysHelper.GetUserId();
            wmsMaterial.CreatedUserName = wmsMaterial.UpdatedUserName = SysHelper.GetUserName();
            wmsMaterial.CreatedTime = wmsMaterial.UpdatedTime = SysHelper.GetNowTime();
            //替代品信息
            var substituteGoodList = input.SubstituteGoodList.Adapt<List<WmsSubstituteGood>>();
            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);
            }
        }
        /// <summary>
        /// 删除物料信息表
        /// 删除物料信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
@@ -232,28 +247,89 @@
        {
            var wmsMaterial = await _wmsMaterialRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsMaterialRep.DeleteAsync(wmsMaterial);
        }
        /// <summary>
        /// 更新物料信息表
        /// 更新物料信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsMaterial/edit")]
        public async Task Update(UpdateWmsMaterialInput input)
        [UnitOfWork]
        public async Task Update(UpdateWmsMaterialInfoInput input)
        {
            var isExist = await _wmsMaterialRep.AnyAsync(u => u.Id == input.Id, false);
            //物料信息
            var wmsMaterial = input.MaterialInput.Adapt<WmsMaterial>();
            var isExist = await _wmsMaterialRep.AnyAsync(u => u.Id == wmsMaterial.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D1002);
            var wmsMaterial = input.Adapt<WmsMaterial>();
            //验证
            await CheckExisit(wmsMaterial,true);
            await CheckExisit(wmsMaterial, true);
            //控制规则信息
            var controlRuleld = input.ControlRuleld;
            wmsMaterial.ControlRuleId = controlRuleld;
            //删除物料客户关联关系
            var oldaterialCustomerList = await _wmsMaterialCustomerRep.DetachedEntities.Where(w => w.MaterialId == wmsMaterial.Id).ToListAsync();
            if (oldaterialCustomerList?.Count > 0)
            {
                await _wmsMaterialCustomerRep.DeleteAsync(oldaterialCustomerList);
            }
            //往来关系信息
            var baseCustomerList = input.BaseCustomerList.Adapt<List<BaseCustomer>>();
            //物料客户关联关系
            var materialCustomerList = new List<WmsMaterialCustomer>();
            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
                });
            }
            //删除替代品信息
            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<WmsSubstituteGood>>();
            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);
            await _wmsMaterialRep.UpdateAsync(wmsMaterial, ignoreNullValues: true);
        }
        #endregion
@@ -261,23 +337,23 @@
        #region 导入
        /// <summary>
        /// Excel模板导入物料信息表功能
        /// Excel模板导入物料信息功能
        /// </summary>
        /// <param name="file">Excel模板文件</param>
        /// <returns>导入的记录数</returns>
        [HttpPost("WmsMaterial/importExcel")]
        public async Task<int> 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);
            var addList = await CommonImport(importDataTable, _DataStartLine);
            lock (_lock)
            {
                _wmsMaterialRep.InsertAsync(addList);
            }
            await Task.CompletedTask;
            return addList.Count;
@@ -298,277 +374,278 @@
            {
                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
                //导入模版定制化代码(替换模版使用)
                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))
                {
                    throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}不能为空!");
                }
                if (!string.IsNullOrEmpty(_MaterialType))
                {
                    System.Int32 enumMaterialType = default(System.Int32);
                    if (!Enum.TryParse<System.Int32>(_MaterialType, out enumMaterialType) && !string.IsNullOrEmpty(_MaterialType))
                    {
                        throw Oops.Oh($"第{index}行[物料类型]{_MaterialType}值不正确!");
                    }
                    else
                    {
                        addItem.MaterialType = enumMaterialType;
                    }
                }
                if (!string.IsNullOrEmpty(_MaterialGroup))
                {
                    addItem.MaterialGroup = (string)_MaterialGroup;
                }
                if (!string.IsNullOrEmpty(_ABCClassName))
                {
                    addItem.ABCClassName = (string)_ABCClassName;
                }
                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(_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);
            //验重
            await CheckExisitForImport(details);
            return details;
        }
        /// <summary>
        /// 根据版本下载物料信息表的Excel导入模板
        /// 根据版本下载物料信息的Excel导入模板
        /// </summary>
        /// <param name="version">模板版本</param>
        /// <returns>下载的模板文件</returns>
@@ -576,7 +653,7 @@
        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"));
            var fileName = HttpUtility.UrlEncode($"导入模板(物料信息).xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
        }
@@ -590,80 +667,117 @@
        /// <param name="input"></param>
        /// <param name="isEdit"></param>
        /// <returns></returns>
        private async Task CheckExisit( WmsMaterial input,bool isEdit=false)
        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);
               }
            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);
       }
        }
        /// <summary>
        /// 根据联合主键验证数据是否已存在-导入时验证
        /// </summary>
        /// <param name="inputs"></param>
        /// <returns></returns>
        private async Task CheckExisitForImport(List<WmsMaterial> 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<WmsMaterial>();
                   var item= existExcelItem.Adapt<WmsMaterial>();
                   throw Oops.Oh($"导入的表格中,物料编号[{item.MaterialCode}]已存在");
                 }
            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<WmsMaterial>();
                var item = existExcelItem.Adapt<WmsMaterial>();
                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<WmsMaterial>();
                var item = existExcelItem2.Adapt<WmsMaterial>();
                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<WmsMaterial>();
                var item = existExcelItem.Adapt<WmsMaterial>();
                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<WmsMaterial>();
                   var item= existExcelItem.Adapt<WmsMaterial>();
                   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<WmsMaterial>();
                var item = existExcelItem.Adapt<WmsMaterial>();
                throw Oops.Oh($"系统中,物料编号[{item.MaterialName}]已存在");
            }
        }
        #endregion