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); }
public List <T> GetAllStateless() { return(StatelessSession.Query <T>().ToList()); }
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); }