public override int Update(MaterialBO bo)
        {
            var type     = MaterialTypeRepository.FindById(bo.TypeId);
            var category = MaterialCategoryRepository.FindById(bo.CategoryId);

            if (category.RequireContainer == true)
            {
                var material = Repository.FindById(bo.ContainerMaterialId);
                if (material == null)
                {
                    throw new BusinessException(ResponseCode.CannotFindMaterialById.Format(bo.ContainerMaterialId));
                }
                bo.ContainerPartNumber = material.PartNumber;
            }
            if (category.RequireRack == true)
            {
                var material = Repository.FindById(bo.RackId);
                if (material == null)
                {
                    throw new BusinessException(ResponseCode.CannotFindMaterialById.Format(bo.RackId));
                }
                bo.RackPn = material.PartNumber;
            }
            bo.CategoryId   = type.CategoryId;
            bo.CategoryCode = category.Code;
            if (bo.Configs != null && bo.Configs.Count > 0)
            {
                bo.Configs.AsParallel().ForAll(x => x.MaterialId = bo.Id);
                ConfigRepository.Delete(x => x.MaterialId == bo.Id);
                ConfigRepository.BulkInsert(Mapper.Map <List <MaterialConfig> >(bo.Configs));
            }
            return(base.Update(bo));
        }
        public override int?Add(MaterialBO bo)
        {
            var type     = MaterialTypeRepository.FindById(bo.TypeId);
            var category = MaterialCategoryRepository.FindById(bo.CategoryId);

            if (category.RequireContainer == true)
            {
                var material = Repository.FindById(bo.ContainerMaterialId);
                if (material == null)
                {
                    throw new BusinessException(ResponseCode.CannotFindMaterialById.Format(bo.ContainerMaterialId));
                }
                bo.ContainerPartNumber = material.PartNumber;
            }
            if (category.RequireRack == true)
            {
                var material = Repository.FindById(bo.RackId);
                if (material == null)
                {
                    throw new BusinessException(ResponseCode.CannotFindMaterialById.Format(bo.RackId));
                }
                bo.RackPn = material.PartNumber;
            }
            if (category.ManualPartNumber == true)  //手动输入PN
            {
                //判断用户输入的PN是否重复
                if (string.IsNullOrWhiteSpace(bo.PartNumber))
                {
                    throw new BusinessException(ResponseCode.PartNumberCannotBeNull);
                }
                else
                {
                    if (Repository.Count(x => x.PartNumber == bo.PartNumber) > 0)
                    {
                        throw new BusinessException(ResponseCode.PartNumberAlreadyExists.Format(bo.PartNumber));
                    }
                }
            }
            else
            {
                //自动生成PN
                var brand    = BrandRepository.FindById(bo.BrandId);
                var serialNo = SerialNoRepository.SingleOrDefault(x => x.BrandCode == brand.Code && x.TypeCode == type.Code);
                var number   = 1;
                if (serialNo == null)
                {
                    serialNo = new MaterialSerialNo()
                    {
                        BrandCode = brand.Code, TypeCode = type.Code, SerialNo = number
                    };
                    serialNo.SerialNo++;
                    SerialNoRepository.Insert(serialNo);
                }
                else
                {
                    if (serialNo.SerialNo >= 99)
                    {
                        throw new BusinessException(ResponseCode.MaterialCountOverLimit);
                    }
                    number = serialNo.SerialNo;
                    serialNo.SerialNo++;
                    SerialNoRepository.Update(serialNo);
                }
                var pn = $"{brand.Code}{type.Code}{number.ToString().PadLeft(2, '0')}";
                bo.PartNumber = pn;
            }

            bo.CategoryId   = type.CategoryId;
            bo.CategoryCode = category.Code;
            var id = base.Add(bo);

            if (bo.Configs != null && bo.Configs.Count > 0)
            {
                bo.Configs.AsParallel().ForAll(x => x.MaterialId = id);
                ConfigRepository.BulkInsert(Mapper.Map <List <MaterialConfig> >(bo.Configs));
            }
            return(id);
        }