payne
2024-04-26 472ae45885f426cb92db6185dd3c6bf377004fab
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsMaterial/WmsMaterialService.cs
@@ -13,6 +13,7 @@
using System.Web;
using System.ComponentModel;
using System.Data;
using Microsoft.CodeAnalysis;
namespace Admin.NET.Application
{
    /// <summary>
@@ -28,14 +29,22 @@
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
        private readonly IRepository<WmsMaterialCustomer, MasterDbContextLocator> _wmsMaterialCustomerRep;
        private readonly IRepository<BaseCustomer, MasterDbContextLocator> _baseCustomerRep;
        private readonly IRepository<WmsSubstituteGood, MasterDbContextLocator> _wmsSubstituteGoodRep;
        private readonly IRepository<WmsControlRuleDetail, MasterDbContextLocator> _wmsControlRuleDetailRep;
        private readonly IRepository<WmsMaterialType, MasterDbContextLocator> _wmsMaterialTypeRep;
        private readonly IRepository<WmsUnit, MasterDbContextLocator> _wmsUnitRep;
        public WmsMaterialService(
            IRepository<WmsMaterial,MasterDbContextLocator> wmsMaterialRep
            ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
            ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
            ,ISysExcelTemplateService sysExcelTemplateService
            , IRepository<WmsMaterialCustomer, MasterDbContextLocator> wmsMaterialCustomerRep
            , IRepository<BaseCustomer, MasterDbContextLocator> baseCustomerRep
            , IRepository<WmsSubstituteGood, MasterDbContextLocator> wmsSubstituteGoodRep
            , IRepository<WmsControlRuleDetail, MasterDbContextLocator> wmsControlRuleDetailRep
            , IRepository<WmsMaterialType, MasterDbContextLocator> wmsMaterialTypeRep
            , IRepository<WmsUnit, MasterDbContextLocator> wmsUnitRep
        )
        {
            _wmsMaterialRep = wmsMaterialRep;
@@ -43,7 +52,11 @@
         _sysDictDataRep = sysDictDataRep;
         _sysExcelTemplateService = sysExcelTemplateService;
            _wmsMaterialCustomerRep = wmsMaterialCustomerRep;
            _baseCustomerRep = baseCustomerRep;
            _wmsSubstituteGoodRep = wmsSubstituteGoodRep;
            _wmsControlRuleDetailRep = wmsControlRuleDetailRep;
            _wmsMaterialTypeRep = wmsMaterialTypeRep;
            _wmsUnitRep = wmsUnitRep;
        }
        /// <summary>
        /// 分页查询物料信息
@@ -156,9 +169,49 @@
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsMaterial/detail")]
        public async Task<WmsMaterialOutput> Get([FromQuery] QueryeWmsMaterialInput input)
        public async Task<WmsMaterialInfoOutput> Get([FromQuery] QueryeWmsMaterialInput input)
        {
            return (await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsMaterialOutput>();
            WmsMaterialInfoOutput resultInfo = new WmsMaterialInfoOutput();
            //获取物料信息
            var wmsMaterialInfo =(await _wmsMaterialRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsMaterialOutput>();
            //获取替换物料信息
            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<WmsSubstituteGoodOutput>()
                                         .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<WmsControlRuleDetailOutput>()
                                              .ToListAsync();
            //物料客户关联
            var wmsMaterialCustomerList = await _wmsMaterialCustomerRep.DetachedEntities
                                              .Where(u => u.MaterialId == wmsMaterialInfo.Id)
                                              .Where(u => u.IsDeleted == false)
                                              .OrderBy(o => o.CreatedTime)
                                              .ProjectToType<WmsMaterialCustomerOutput>()
                                              .ToListAsync();
            List<long> custIds = wmsMaterialCustomerList.Select(s => s.CustId).ToList();
            //根据物料客户关联表获取往来信息
            var baseCustomers = await _baseCustomerRep.DetachedEntities
                                      .Where(p => custIds.Contains(p.Id))
                                      .OrderBy(o => o.CreatedTime)
                                      .ProjectToType<BaseCustomerOutput>()
                                      .ToListAsync();
            resultInfo.MaterialInfo = wmsMaterialInfo;
            resultInfo.SubstituteGoodList = wmsSubstituteGoods;
            resultInfo.ControlRuleDetailList = wmsControlRuleDetails;
            resultInfo.BaseCustomerList = baseCustomers;
            return resultInfo;
        }
        /// <summary>
@@ -190,40 +243,82 @@
            //控制规则信息
            var controlRuleld = input.ControlRuleld;
            wmsMaterial.ControlRuleId = controlRuleld;
            //获取物料类型
            var wmsMaterialType = (await _wmsMaterialTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == wmsMaterial.MaterialType && u.IsDeleted == false)).Adapt<WmsMaterialTypeOutput>();
            if(wmsMaterialType==null) throw Oops.Oh($"ID{wmsMaterial.MaterialType}物料类型不存在");
            //客户档案信息
            var baseCustomerList = input.BaseCustomerList.Adapt<List<BaseCustomer>>();
            //物料客户关联关系
            var materialCustomerList=new List<WmsMaterialCustomer>();
            foreach (var baseCustomer in baseCustomerList)
            wmsMaterial.MaterialTypeName = wmsMaterialType.MaterialTypeName;
            var materialCustomerList = new List<WmsMaterialCustomer>();
            if (input.BaseCustomerList?.Count > 0)
            {
                materialCustomerList.Add(new WmsMaterialCustomer()
                //往来单位
               var   wmsBaseCustomerList = await _baseCustomerRep.DetachedEntities.Where(u => input.BaseCustomerList.Contains(u.Id) && u.IsDeleted == false).ProjectToType<BaseCustomerOutput>().ToListAsync();
                if (wmsBaseCustomerList?.Count() <= 0)
                {
                    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
                });
                    throw Oops.Oh($"往来单位不存在");
                }
                //物料客户关联关系
                 materialCustomerList = new List<WmsMaterialCustomer>();
                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<WmsSubstituteGood>>();
            List<string> materialCodes = substituteGoodList.Select(s => s.SubstituteMaterialCode).ToList();
            wmsMaterial.CreatedUserId = wmsMaterial.UpdatedUserId = SysHelper.GetUserId();
            wmsMaterial.CreatedUserName = wmsMaterial.UpdatedUserName = SysHelper.GetUserName();
            wmsMaterial.CreatedTime = wmsMaterial.UpdatedTime = SysHelper.GetNowTime();
            if (materialCodes?.Count > 0)
            {
                var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.DetachedEntities.Where(u => materialCodes.Contains(u.MaterialCode) && u.IsDeleted == false).ProjectToType<WmsMaterialOutput>().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);
@@ -256,19 +351,118 @@
        /// <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);
            //控制规则信息
            var controlRuleld = input.ControlRuleld;
            wmsMaterial.ControlRuleId = controlRuleld;
            //获取物料类型
            var wmsMaterialType = (await _wmsMaterialTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == wmsMaterial.MaterialType && u.IsDeleted == false)).Adapt<WmsMaterialTypeOutput>();
            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 materialCustomerList = new List<WmsMaterialCustomer>();
            if (input.BaseCustomerList?.Count > 0)
            {
                //往来单位
                var wmsBaseCustomerList = await _baseCustomerRep.DetachedEntities.Where(u => input.BaseCustomerList.Contains(u.Id) && u.IsDeleted == false).ProjectToType<BaseCustomerOutput>().ToListAsync();
                if (wmsBaseCustomerList?.Count() <= 0)
                {
                    throw Oops.Oh($"往来单位不存在");
                }
                //物料客户关联关系
                 materialCustomerList = new List<WmsMaterialCustomer>();
                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<WmsSubstituteGood>>();
            List<string> materialCodes = substituteGoodList.Select(s => s.SubstituteMaterialCode).ToList();
            if(materialCodes?.Count > 0)
            {
                var wmsSubstituteMaterialInfoList = await _wmsMaterialRep.DetachedEntities.Where(u => materialCodes.Contains(u.MaterialCode) && u.IsDeleted == false).ProjectToType<WmsMaterialOutput>().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
@@ -328,11 +522,8 @@
                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 = "";//默认入库库位
@@ -354,11 +545,8 @@
                _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();
@@ -401,14 +589,7 @@
                {
                    addItem.ErpCode = (string)_ErpCode;
                }
                if (!string.IsNullOrEmpty(_MaterialTypeName))
                {
                    addItem.MaterialTypeName = (string)_MaterialTypeName;
                }
                if (!string.IsNullOrEmpty(_MaterialTypeDescr))
                {
                    addItem.MaterialTypeDescr = (string)_MaterialTypeDescr;
                }
                if (string.IsNullOrEmpty(_MaterialType))
                {
@@ -417,26 +598,15 @@
                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;
                    }
                    //TODO  根据物料类型ID获取物料类型
                    addItem.MaterialType = 0;
                    addItem.MaterialTypeName = "";
                }
                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);
@@ -506,38 +676,7 @@
                    }
                }
                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("否"))
@@ -614,9 +753,14 @@
            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//编辑 
@@ -624,10 +768,15 @@
                //当前编辑数据以外是否存在重复
                //当前编辑物料编号以外是否存在重复
                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);
            }
@@ -663,7 +812,19 @@
                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}]已存在");
            }
            //根据联合主键验证数据库中是否已存在相同数据
@@ -680,6 +841,21 @@
                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