예제 #1
0
        protected override UpdateResult Execute()
        {
            var updateResult = UpdateResult.OK;
            var user         = Session.Query <User>().First();

            Progress.OnNext(new Progress("Соединение", 100, 0));
            Client.BaseAddress = ConfigureHttp() ?? Client.BaseAddress;
            Progress.OnNext(new Progress("Отправка заказов", 0, 50));
            var orders = Session.Query <Order>().ReadyToSend(address).ToList();

            Log.InfoFormat("Попытка отправить заказы, всего заказов к отправке {0}", orders.Count);
            var specialMarkupProducts = SpecialMarkupCatalog.Load(Session.Connection);

            try {
                foreach (var order in orders)
                {
                    Log.InfoFormat("Попытка отправки заказа {0} по прайсу {1} ({2}) от {3} с кол-вом позиций {4}",
                                   order.Id, order.PriceName, order.Price.Id.PriceId, order.Price.PriceDate, order.Lines.Count);
                    order.Lines.Each(x => x.CalculateRetailCost(Settings.Markups, specialMarkupProducts, user));
                }
            }
            catch (Exception e) {
                Log.Error("Ошибка протоколирования", e);
            }
            var clientOrders = orders.Select(o => o.ToClientOrder(Session)).Where(o => o != null).ToArray();

            if (clientOrders.Length == 0)
            {
                throw new EndUserError("Не заказов для отправки");
            }

            uint requestId = 0;
            var  response  = Wait("Orders",
                                  Client.PostAsync("Orders", new SyncRequest(clientOrders, Force), Formatter, Token), ref requestId);

            var results = response.Content.ReadAsAsync <OrderResult[]>().Result
                          ?? new OrderResult[0];

            CheckResult(Client.PutAsJsonAsync("Orders", new ConfirmRequest(requestId), Token));
            Log.InfoFormat("Заказы отправлены успешно");

            orders.Each(o => o.Apply(results.FirstOrDefault(r => r.ClientOrderId == o.Id)));
            var acceptedOrders = orders.Where(o => o.IsAccepted).ToArray();
            var rejectedOrders = orders.Where(o => !o.IsAccepted).ToArray();
            var sentOrders     = acceptedOrders.Select(o => new SentOrder(o)).ToArray();

            acceptedOrders.Where(o => o.Limit != null).Each(o => o.Limit.Value -= o.Sum);
            foreach (var order in orders)
            {
                if (order.IsAccepted)
                {
                    Log.InfoFormat("Заказ {0} успешно отправлен, Id заказа на сервере: {1}", order.Id, order.ServerId);
                }
                else
                {
                    Log.InfoFormat("Заказ {0} отвергнут сервером, причина: {1}", order.Id, order.SendError);
                }
            }

            Session.SaveEach(sentOrders);
            Session.DeleteEach(acceptedOrders);

            Progress.OnNext(new Progress("Отправка заказов", 100, 100));

            if (rejectedOrders.Any())
            {
                //если мы получили заказ без номера заказа с сервера значит он не принят
                //тк включена опция предзаказа и есть проблемы с другими заказами
                //если сервер уже знает что опция включена а клиент еще нет
                if (!user.IsPreprocessOrders)
                {
                    user.IsPreprocessOrders = rejectedOrders
                                              .SelectMany(r => r.Lines)
                                              .Any(l => l.SendResult != LineResultStatus.OK) ||
                                              rejectedOrders.Any(o => o.SendResult == OrderResultStatus.OK && o.ServerId == 0);
                }

                if (!user.IsPreprocessOrders)
                {
                    var resultText = rejectedOrders.Implode(
                        o => $"прайс-лист {o.Price.Name} - {o.SendError}",
                        Environment.NewLine);
                    var text = new TextViewModel(resultText)
                    {
                        Header      = "Данные заказы НЕ ОТПРАВЛЕНЫ",
                        DisplayName = "Не отправленные заказы"
                    };
                    Results.Add(new DialogResult(text));
                }
                else
                {
                    Results.Add(new DialogResult(new Correction(address.Id), fullScreen: true));
                }
                updateResult = UpdateResult.NotReload;
            }
            if (sentOrders.Length > 0)
            {
                if (Settings.PrintOrdersAfterSend)
                {
                    Results.Add(new PrintResult("Отправленные заказы", sentOrders.Select(o => {
                        var lines = o.Lines.ToList();
                        if (SortComparer != null)
                        {
                            lines.Sort(SortComparer);
                        }
                        return(new OrderDocument(o, lines.ToArray()));
                    })));
                }
                if (user.SaveOrders)
                {
                    try {
                        var dir = Settings.InitAndMap("Orders");
                        foreach (var sentOrder in sentOrders)
                        {
                            var name = Path.Combine(dir, sentOrder.ServerId + ".txt");
                            using (var writer = new StreamWriter(name, false, Encoding.Default)) {
                                writer.WriteLine("Номер;Аптека;Дата;Код;Товар;ЗаводШК;Производитель;Количество;Приоритет;Цена;Поставщик");
                                foreach (var line in sentOrder.Lines)
                                {
                                    var payload   = new string[0];
                                    var orderLine = orders.SelectMany(o => o.Lines).FirstOrDefault(l => l.ExportId == line.ServerId);
                                    if (orderLine != null && orderLine.ExportBatchLineId != null)
                                    {
                                        var batchline = StatelessSession.Query <BatchLine>()
                                                        .FirstOrDefault(b => b.ExportId == orderLine.ExportBatchLineId.Value);
                                        if (batchline != null)
                                        {
                                            payload = (batchline.ParsedServiceFields.GetValueOrDefault("ReportData") ?? "").Split(';');
                                        }
                                    }

                                    writer.WriteLine("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10}",
                                                     GetIndexOrDefault(payload, 0),
                                                     GetIndexOrDefault(payload, 1),
                                                     sentOrder.SentOn,
                                                     GetIndexOrDefault(payload, 3),
                                                     line.ProductSynonym,
                                                     GetIndexOrDefault(payload, 5),
                                                     line.ProducerSynonym,
                                                     line.Count,
                                                     GetIndexOrDefault(payload, 9),
                                                     GetIndexOrDefault(payload, 10),
                                                     line.Order.Price.Name);
                                }
                            }
                        }
                    }
                    catch (Exception e) {
#if DEBUG
                        throw;
#else
                        Log.Error("Ошибка при сохранении заявок", e);
#endif
                    }
                }
            }

            return(updateResult);
        }
예제 #2
0
 public List <T> GetAllStateless()
 {
     return(StatelessSession.Query <T>().ToList());
 }
예제 #3
0
 public IQueryable <T> QueryManyStateless(Expression <System.Func <T, bool> > expression)
 {
     return(StatelessSession.Query <T>().Where(expression).AsQueryable());
 }
        public Order Unfreeze(IOrder sourceOrder, Address addressToOverride, ISession session, StringBuilder log)
        {
            var action = GuesAction(sourceOrder);

            if (!sourceOrder.IsAddressExists())
            {
                if (ShouldCalculateStatus(sourceOrder))
                {
                    var order = (Order)sourceOrder;
                    order.SendResult = OrderResultStatus.Reject;
                    order.SendError  = Restore
                                                ? "Заказ был заморожен, т.к. адрес доставки больше не доступен"
                                                : "Адрес доставки больше не доступен";
                }
                log.AppendLine($"Заказ №{sourceOrder.DisplayId} невозможно" +
                               $" {action}, т.к. адрес доставки больше не доступен.");
                return(null);
            }

            if (!sourceOrder.IsPriceExists())
            {
                if (ShouldCalculateStatus(sourceOrder))
                {
                    var order = (Order)sourceOrder;
                    order.SendResult = OrderResultStatus.Reject;
                    order.SendError  = Restore ? "Заказ был заморожен, т.к. прайс-листа нет в обзоре" : "Прайс-листа нет в обзоре";
                }
                log.AppendLine($"Заказ №{sourceOrder.DisplayId} невозможно" +
                               $" {action}, т.к. прайс-листа нет в обзоре.");
                return(null);
            }
            var address = addressToOverride ?? sourceOrder.Address;

            var destOrder = session.Query <Order>().FirstOrDefault(o => o.Id != sourceOrder.Id &&
                                                                   o.Address == address &&
                                                                   o.Price == sourceOrder.Price &&
                                                                   !o.Frozen);

            if (destOrder == null)
            {
                destOrder = new Order(sourceOrder.Price, address)
                {
                    Comment         = sourceOrder.Comment,
                    PersonalComment = sourceOrder.PersonalComment
                };
                if (Restore)
                {
                    destOrder.CreatedOn = sourceOrder.CreatedOn;
                }
            }

            var anyOffer = session.Query <Offer>().Any(o => o.Price == sourceOrder.Price);

            if (!anyOffer)
            {
                if (ShouldCalculateStatus(sourceOrder))
                {
                    var order = (Order)sourceOrder;
                    order.SendResult = OrderResultStatus.Reject;
                    order.SendError  = Restore ? "Заказ был заморожен, т.к. прайс-листа нет в обзоре" : "Прайс-листа нет в обзоре";
                }
                log.AppendLine(String.Format("Заказ №{0} невозможно {3}, т.к. прайс-листа {1} - {2} нет в обзоре",
                                             sourceOrder.DisplayId,
                                             sourceOrder.Price.Name,
                                             sourceOrder.Price.RegionName,
                                             action));
                return(null);
            }

            var ids         = sourceOrder.Lines.Select(l => l.ProductSynonymId).ToArray();
            var orderOffers = new Offer[0];

            if (ids.Length > 0)
            {
                orderOffers = Offer.Orderable(StatelessSession.Query <Offer>())
                              .Where(o => ids.Contains(o.ProductSynonymId) && o.Price == sourceOrder.Price)
                              .Fetch(o => o.Price)
                              .ToArray();
            }
            foreach (var line in sourceOrder.Lines.ToArray())
            {
                var offers = orderOffers
                             .Where(o => o.ProductSynonymId == line.ProductSynonymId &&
                                    o.ProducerSynonymId == line.ProducerSynonymId &&
                                    o.Price.Id == sourceOrder.Price.Id &&
                                    o.Code == line.Code &&
                                    o.RequestRatio == line.RequestRatio &&
                                    o.MinOrderCount == line.MinOrderCount &&
                                    o.MinOrderSum == line.MinOrderSum &&
                                    o.Junk == line.Junk)
                             .ToArray()
                             .OrderBy(o => o.ResultCost)
                             .ToArray();
                Merge(destOrder, sourceOrder, line, offers, log);
            }

            var currentOrder = sourceOrder as Order;

            if (currentOrder != null && currentOrder.IsEmpty)
            {
                session.Delete(sourceOrder);
            }
            if (!destOrder.IsEmpty && sourceOrder is DeletedOrder)
            {
                session.Delete(sourceOrder);
            }
            if (destOrder.IsEmpty)
            {
                return(null);
            }
            if (action == "вернуть в работу")
            {
                destOrder.KeepId = null;
            }
            return(destOrder);
        }