public PriceOfferViewModel(PriceComposedId priceId, bool showLeaders, OfferComposedId initOfferId = null)
            : base(initOfferId)
        {
            //мы не можем принимать объект который принадлежит другой форме
            //это может вызвать исключение если сессия в которой был загружен объект будет закрыта
            //утечки памяти если текущая форма подпишется на события изменения в переданном объекте
            //между формами можно передавать только примитивные объекты
            this.priceId = priceId;

            DisplayName = "Заявка поставщику";
            Price       = new NotifyValue <Price>();
            IsLoading   = new NotifyValue <bool>();

            Filters       = filters;
            CurrentFilter = new NotifyValue <string>(filters[0]);
            if (showLeaders)
            {
                FilterLeader();
            }

            //по идее это не нужно тк обо всем должен позаботится сборщик мусора
            //но если не удалить подписку будет утечка памяти
            OnCloseDisposable.Add(this.ObservableForProperty(m => m.Price.Value.Order)
                                  .Subscribe(_ => NotifyOfPropertyChange(nameof(CanDeleteOrder))));
            SearchBehavior = new SearchBehavior(this);

            CurrentProducer.Cast <object>()
            .Merge(CurrentFilter.Cast <object>())
            .Merge(SearchBehavior.ActiveSearchTerm.Cast <object>())
            .Subscribe(_ => Filter());

            PrintMenuItems = new ObservableCollection <MenuItem>();
            IsView         = true;
        }
        protected override void OnInitialize()
        {
            base.OnInitialize();

            Bus.Listen <string>("db")
            .Where(m => m == "Reload")
            .Subscribe(_ => CatalogOffers?.Clear(), CloseCancellation.Token);

            Offers.Select(v => {
                v = v ?? new List <Offer>();
                if (IsFilterByCatalogName)
                {
                    return(v.GroupBy(g => g.GroupName)
                           .Select(g => new object[] { new GroupHeader(g.Key) }.Concat(g))
                           .SelectMany(o => o)
                           .ToList());
                }
                else
                {
                    return(v.Cast <object>().ToList());
                }
            })
            .Subscribe(DisplayItems);
            CurrentDisplayItem.OfType <Offer>().Subscribe(CurrentOffer);
            CurrentOffer.Subscribe(CurrentDisplayItem);
            //.Skip(1) - пропускаем начальные значения
            CurrentRegion.Cast <Object>().Skip(1)
            .Merge(CurrentFilter.Skip(1))
            .Merge(CurrentProducer.Skip(1))
            .Merge(HideJunk.Select(v => (object)v).Skip(1))
            .Subscribe(_ => Filter());
            DbReloadToken.SelectMany(_ => Env.RxQuery(s => {
                if (IsFilterByCatalogName)
                {
                    var catalogs = s.Query <Catalog>()
                                   .Fetch(c => c.Name)
                                   .Where(c => c.Name == filterCatalogName).ToArray();
                    var ids = catalogs.Select(c => c.Id).ToArray();

                    var result = s.Query <Offer>()
                                 .Where(o => ids.Contains(o.CatalogId))
                                 .Fetch(o => o.Price)
                                 .ToList();
                    result.Each(o => o.GroupName = catalogs.Where(c => c.Id == o.CatalogId)
                                                   .Select(c => c.FullName)
                                                   .FirstOrDefault());
                    return(result);
                }
                else
                {
                    var catalogId = filterCatalog.Id;
                    return(s.Query <Offer>().Where(o => o.CatalogId == catalogId)
                           .Fetch(o => o.Price)
                           .ToList());
                }
            })).CatchSubscribe(x => {
                CatalogOffers = x;
                UpdateFilters();
                Filter(false);
                UpdateOffers(Offers.Value);
                if (x.Count == 0)
                {
                    Manager.Warning("Нет предложений");
                    TryClose();
                }
            }, CloseCancellation);

            UpdateMaxProducers();
        }
Beispiel #3
0
        protected override void OnInitialize()
        {
            base.OnInitialize();

            var obProducers = DbReloadToken
                              .SelectMany(_ => RxQuery(s => new[] { EmptyProducer }
                                                       .Concat(s.Query <Producer>()
                                                               .OrderBy(p => p.Name)
                                                               .ToList())
                                                       .ToList()));

            obProducers.Subscribe(Producers);
            obProducers.Subscribe(_ =>
            {
                var currentFilterProducerId = CurrentFilterProducer.HasValue ? CurrentFilterProducer.Value.Id : 0;
                if (CanSaveFilterProducer.Value && currentFilterProducerId > 0 &&
                    Producers.Value.Any(d => d.Id == currentFilterProducerId))
                {
                    CurrentProducer.Value = CurrentFilterProducer.Value;
                }
            });

            SearchBehavior.ActiveSearchTerm.Cast <object>()
            .Merge(Prices.Select(p => p.Changed()).Merge().Throttle(Consts.FilterUpdateTimeout, UiScheduler))
            .Merge(OnlyBase.Changed())
            .Merge(CurrentProducer.Changed())
            .Merge(HideJunk.Changed())
            .Merge(DbReloadToken)
            .Select(v => {
                ProducerFilterStateSet();

                var term = SearchBehavior.ActiveSearchTerm.Value;
                if (String.IsNullOrEmpty(term))
                {
                    return(Observable.Return(new List <Offer>()));
                }
                IsLoading.Value = true;
                return(RxQuery(s => {
                    var query = s.Query <Offer>();
                    query = Util.ContainsAny(query, o => o.ProductSynonym,
                                             term.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
                    query = Util.Filter(query, o => o.Price.Id, Prices);

                    var producer = CurrentProducer.Value;
                    if (producer != null && producer.Id > 0)
                    {
                        var id = producer.Id;
                        query = query.Where(o => o.ProducerId == id);
                    }

                    if (OnlyBase)
                    {
                        query = query.Where(o => o.Price.BasePrice);
                    }
                    if (HideJunk)
                    {
                        query = query.Where(o => !o.Junk);
                    }

                    var result = SortOffers(query.Fetch(o => o.Price).ToList());
                    return result;
                }));
            })
            .Switch()
            //будь бдителен CalculateRetailCost и LoadOrderItems может вызвать обращение к базе если данные еще не загружены
            //тк синхронизация не производится загрузка должна выполняться в основной нитке
            .Do(v => {
                LoadOrderItems(v);
                Calculate(v);
                IsLoading.Value = false;
            })
            .Subscribe(Offers, CloseCancellation.Token);

            //используется в случае если нужно найти предложения по позиции отказа
            if (!String.IsNullOrEmpty(initTerm))
            {
                DbReloadToken
                .Do(_ => IsLoading.Value = true)
                .SelectMany(_ => RxQuery(s => QueryByFullText(s, initTerm)))
                .Do(v => {
                    LoadOrderItems(v);
                    Calculate(v);
                    IsLoading.Value = false;
                })
                .Subscribe(Offers, CloseCancellation.Token);
            }
        }
Beispiel #4
0
        protected override void OnInitialize()
        {
            base.OnInitialize();

            CatalogTerm
            .Throttle(Consts.TextInputLoadTimeout, Scheduler)
            .SelectMany(t => RxQuery(s => {
                var threshold = 2;
                if (String.IsNullOrEmpty(t) || t.Length < threshold)
                {
                    return(new List <Product>());
                }
                if (CurrentCatalog.Value != null && CurrentCatalog.Value.Name == t)
                {
                    return(Catalogs.Value);
                }
                return(s.CreateSQLQuery(@"
(select {p.*}, 0 as Score
from Products p
where p.Name like :term)
union
(select {p.*}, 1 as Score
from Products p
where p.Name like :fullterm and p.Name not like :term)
order by Score, {p.Name}")
                       .AddEntity("p", typeof(Product))
                       .SetParameter("term", t + "%")
                       .SetParameter("fullterm", "%" + t + "%")
                       .List <Product>()
                       .ToList());
            }))
            .Subscribe(Catalogs, CloseCancellation.Token);

            Catalogs.Subscribe(x => IsCatalogOpen.Value = x != null && x.Count > 0);

            CurrentCatalog.Subscribe(v => {
                Item.ProductId = (v != null && v.Id > 0) ? v.Id : 0;
                Item.CatalogId = (v != null && v.CatalogId > 0) ? v.CatalogId : 0;
                Item.Product   = (v != null && v.Id > 0) ? v.Name : string.Empty;
            });

            ProducerTerm
            .Throttle(Consts.TextInputLoadTimeout, Scheduler)
            .Do(t => {
                if (String.IsNullOrEmpty(t))
                {
                    CurrentProducer.Value = null;
                }
            })
            .SelectMany(t => RxQuery(s => {
                if (String.IsNullOrEmpty(t))
                {
                    return(s.Query <Producer>().OrderBy(x => x.Name).ToList());
                }
                if (CurrentProducer.Value != null && CurrentProducer.Value.Name == t)
                {
                    return(Producers.Value);
                }
                return(s.CreateSQLQuery(@"
(select {p.*}, 0 as Score
from Producers p
where p.Name like :term)
union
(select {p.*}, 1 as Score
from Producers p
where p.Name like :fullterm and p.Name not like :term)
order by Score, {p.Name}")
                       .AddEntity("p", typeof(Producer))
                       .SetParameter("term", t + "%")
                       .SetParameter("fullterm", "%" + t + "%")
                       .List <Producer>()
                       .ToList());
            }))
            .Subscribe(Producers, CloseCancellation.Token);

            Producers.Subscribe(x => IsProducerOpen.Value = x != null && x.Count > 0);

            CurrentProducer.Subscribe(v => {
                Item.Producer   = (v != null && v.Id > 0) ? v.Name : string.Empty;
                Item.ProducerId = (v != null && v.Id > 0) ? v.Id : (uint?)null;
            });
        }
        protected override void OnInitialize()
        {
            base.OnInitialize();

            Catalogs = CatalogTerm
                       .Throttle(Consts.TextInputLoadTimeout, Scheduler)
                       .Select(t => RxQuery(s => {
                if (String.IsNullOrEmpty(t))
                {
                    return(new List <Catalog>());
                }
                if (CurrentCatalog.Value != null && CurrentCatalog.Value.FullName == t)
                {
                    return(Catalogs.Value);
                }

                return(s.CreateSQLQuery(@"
(select {c.*}, 0 as Score
from Catalogs c
where c.Fullname like :term)
union distinct
(select {c.*}, 1 as Score
from Catalogs c
where c.Fullname like :fullterm)
order by Score, {c.FullName}")
                       .AddEntity("c", typeof(Catalog))
                       .SetParameter("term", t + "%")
                       .SetParameter("fullterm", "%" + t + "%")
                       .List <Catalog>()
                       .ToList());
            }))
                       .Switch()
                       .ToValue(CloseCancellation);
            IsCatalogOpen = Catalogs.Select(v => v != null && v.Count > 0).Where(v => v).ToValue();
            CurrentCatalog.Subscribe(v => Item.Catalog = v);

            Producers = ProducerTerm
                        .Throttle(Consts.TextInputLoadTimeout, Scheduler)
                        .Select(t => RxQuery(s => {
                if (String.IsNullOrEmpty(t))
                {
                    return new List <Producer> {
                        emptyProducer
                    }
                }
                ;
                if (CurrentProducer.Value != null && CurrentProducer.Value.Name == t)
                {
                    return(Producers.Value);
                }

                CurrentProducer.Value = null;
                var items             = s.CreateSQLQuery(@"
(select {p.*}, 0 as Score
from Producers p
where p.Name like :term)
union distinct
(select {p.*}, 1 as Score
from Producers p
where p.Name like :fullterm)
order by Score, {p.Name}")
                                        .AddEntity("p", typeof(Producer))
                                        .SetParameter("term", t + "%")
                                        .SetParameter("fullterm", "%" + t + "%")
                                        .List <Producer>();
                return(new[] { emptyProducer }.Concat(items).ToList());
            }))
                        .Switch()
                        .ToValue(CloseCancellation);
            IsProducerOpen = Producers.Select(v => v != null && v.Count > 1).Where(v => v).ToValue();
            CurrentProducer.Subscribe(v => Item.Producer = (v != null && v.Id > 0) ? v : null);
        }