예제 #1
0
        public ProductSelector(Bank bank, IEnumerable <Parameter> parameters, Product selectedProduct = null, int amount = 1)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            Bank   = bank;
            Amount = amount;

            //создаем селектор блока
            BlockSelector = new ProductBlockSelector(parameters, Bank, selectedProduct?.ProductBlock);
            //подписываемся на событие его изменения
            BlockSelector.SelectedBlockChanged += selector =>
            {
                RefreshProductSelectors();
                SelectedProductChanged?.Invoke();
                OnPropertyChanged(nameof(SelectedProduct));
            };

            //удаление/добавление селекторов дочерних продуктов
            ProductSelectors.CollectionChanged += (sender, args) =>
            {
                args.NewItems?.Cast <ProductSelector>().ForEach(x => x.SelectedProductChanged += OnChildProductChanged);
                args.OldItems?.Cast <ProductSelector>().ForEach(x => x.SelectedProductChanged -= OnChildProductChanged);
            };

            if (selectedProduct == null)
            {
                //поиск селектора, содержащего базовые параметры
                var parameterSelector = BlockSelector.ParameterSelectors.Single(x => x.ParametersFlaged.All(p => p.Parameter.IsOrigin));
                //выбор параметра
                parameterSelector.SelectedParameterFlaged = parameterSelector.ParametersFlaged.First();
            }
            else
            {
                foreach (var kvp in GetDictionaryOfMatching(selectedProduct))
                {
                    if (Equals(kvp.Value, default(IEnumerable <Product>)))
                    {
                        continue;
                    }

                    foreach (var product in kvp.Value)
                    {
                        //редактируем список параметров
                        var usefullParameters = bank.Parameters.GetUsefull(kvp.Key);
                        var productSelector   = new ProductSelector(bank, usefullParameters, product);
                        ProductSelectors.Add(productSelector);
                    }
                }
            }
        }
예제 #2
0
        private void RefreshProductSelectors()
        {
            //упорядочиваем селектры продуктов по уменьшению количества параметров в блоке
            var productSelectors = ProductSelectors.OrderByDescending(x => x.SelectedProduct.ProductBlock.Parameters.Count).ToList();

            //загружаем связи к дочерним продуктам, упорядоченные по количеству параметров, зависимого продукта
            var childProductsRelations = Bank.RelationsToChildProducts(SelectedProduct).OrderBy(x => x.ChildProductParameters.Count).ToList();

            var relaitionsDictionary = new Dictionary <ProductRelation, int>();

            foreach (var actualProductRelation in childProductsRelations)
            {
                relaitionsDictionary.Add(actualProductRelation, actualProductRelation.ChildProductsAmount);
            }

            //удаление неактуальных селекторов и чистка связей
            foreach (var productSelector in productSelectors.ToList())
            {
                //ищем связь, которая соответствует селектору
                var relation = childProductsRelations.FirstOrDefault(x => x.ChildProductParameters.AllContainsIn(productSelector.BlockSelector.SelectedBlock.Parameters));

                //если не находим - сносим ее
                if (relation == null)
                {
                    ProductSelectors.Remove(productSelector);
                }
                //если находим - корректируем связь и удаляем этот селектор из поиска
                else
                {
                    productSelectors.Remove(productSelector);

                    relaitionsDictionary[relation] -= productSelector.Amount;
                    if (relaitionsDictionary[relation] == 0)
                    {
                        childProductsRelations.Remove(relation);
                    }
                }
            }

            //добавление новых актуальных селекторов
            foreach (var productRelation in childProductsRelations)
            {
                for (int i = 0; i < relaitionsDictionary[productRelation]; i++)
                {
                    //новый селектор с усеченными под связь параметрами
                    var productSelector = new ProductSelector(Bank, Bank.Parameters.GetUsefull(productRelation));
                    ProductSelectors.Add(productSelector);
                }
            }

            OnPropertyChanged(nameof(HasDependentProducts));
        }
예제 #3
0
        public Product GetProduct(Product originProduct = null)
        {
            var bank = GetBank(originProduct);

            //предварительно выбранный продукт
            var selectedProduct = originProduct == null
                ? null
                : bank.Products.Single(x => x.Id == originProduct.Id);

            var productSelector = new ProductSelector(bank, bank.Parameters, selectedProduct);
            var owner           = Application.Current.Windows.OfType <Window>().SingleOrDefault(x => x.IsActive);
            var window          = new SelectProductWindow {
                DataContext = productSelector, Owner = owner
            };

            window.ShowDialog();

            //если необходимо создать новый продукт
            if (window.ShoodCreateNew)
            {
                var productNew = Container.Resolve <INewProductService>().GetNewProduct();
                return(productNew ?? originProduct);
            }

            //если необходимо выбрать комплект
            if (window.ShoodSelectComplect)
            {
                var complectViewModel = Container.Resolve <ComplectsViewModel>();
                complectViewModel.ShowDialog();
                return(complectViewModel.IsSelected
                    ? complectViewModel.SelectedItem.Product
                    : originProduct);
            }

            //выходим, если пользователь отменил выбор продукта.
            if (!window.DialogResult.HasValue || !window.DialogResult.Value)
            {
                return(originProduct);
            }

            var result = productSelector.SelectedProduct;

            //оставляем только уникальные блоки
            //var blocks = result.GetBlocks().Distinct().ToList();
            //SubstitutionBlocks(result, blocks);

            //загрузка актуальных продуктов
            var products = UnitOfWork.Repository <Product>().GetAll();

            //если выбранного продукта нет в базе
            if (products.Contains(result) == false)
            {
                SubstitutionProducts(result, products);
                if (UnitOfWork.SaveEntity(result).OperationCompletedSuccessfully)
                {
                    Container.Resolve <IEventAggregator>().GetEvent <AfterSaveProductEvent>().Publish(result);
                }
                else
                {
                    throw new Exception("Ошибка при сохранении нового продукта в базу данных.");
                }
            }

            return(result);
        }