/// <summary> /// Get order status name /// </summary> /// <param name="os">Order status</param> /// <returns>Order status name</returns> public static string GetOrderStatusName(this OrderStatusEnum os) { string name = IoC.Resolve <ILocalizationManager>().GetLocaleResourceString( string.Format("OrderStatus.{0}", os.ToString()), NopContext.Current.WorkingLanguage.LanguageId, true, CommonHelper.ConvertEnum(os.ToString())); return(name); }
/// <summary> /// 收货订单 /// </summary> /// <param name="list"></param> /// <param name="userName"></param> /// <param name="status"></param> /// <returns></returns> /// <remarks> /// 1. 增加库存,2. 增加入库记录 3. 修改订单状态 /// </remarks> public async Task <Result <int> > receiveOrder(List <InStorageRecord> list, string userName, OrderStatusEnum status) { Result <int> result = new Result <int>(); string orderNo = list.First().orderNo; try { using (LayerDbContext context = new LayerDbContext()) { var model = context.orderInfo.Where(x => x.orderNo == orderNo).Single(); if (model.status == status.ToString()) { result.addError("进货单已被" + model.receivedBy + "收货"); } else { //订单状态 model.status = status.ToString(); model.receivedDate = DateTime.Now; model.receivedBy = userName; model.sumPriceReal = list.Sum(x => x.countReal * x.priceIn); //入库记录 context.inStorageRecord.AddRange(list); //库存 List <Inventory> inventoryList = new List <Inventory>(); Inventory model1 = null; foreach (var item in list) { model1 = new Inventory() { count = item.countReal, materialId = item.materialId, priceIn = item.priceIn }; inventoryList.Add(model1); } context.inventory.AddRange(inventoryList); await context.SaveChangesAsync(); } } } catch (Exception err) { result.addError(err.Message); } return(result); }
public ReceivableBooked(Guid orderId, Money receivableTotal, int customerBalanceId, OrderStatusEnum orderStatus) { this.OrderId = orderId; this.ReceivableTotal = receivableTotal; this.CustomerBalanceId = customerBalanceId; this.OrderStatus = orderStatus; this.Topic = orderStatus.ToString(); }
// кисти фона и текста public static void SetStateButtonBrushes(OrderStatusEnum eState, out Brush backgroundBrush, out Brush foregroundBrush) { Dictionary <string, BrushesPair> appBrushes = BrushHelper.AppBrushes; BrushesPair bp = appBrushes[eState.ToString()]; backgroundBrush = bp.Background; foregroundBrush = bp.Foreground; } // method
private string getDishStrForNoticeFile(OrderDishModel dishModel) { OrderStatusEnum toFileStatus = (OrderStatusEnum)dishModel.DishStatusId; if (toFileStatus == OrderStatusEnum.ReadyConfirmed) { toFileStatus = OrderStatusEnum.Ready; } return(string.Format("Dish: {1};{2}{0}Dish Status: {3} ({4})", Environment.NewLine, dishModel.Id, dishModel.Name, (int)toFileStatus, toFileStatus.ToString())); }
public OrderItemAdded( Guid orderId, int customerId, Money orderTotal, OrderItem orderItem, Read.OrderStatusEnum orderStatus, OrderStatusEnum itemOrderStatus) { Guard.NotNull(orderItem, nameof(orderItem)); this.OrderId = orderId; this.CustomerId = customerId; this.OrderTotal = orderTotal; this.OrderItem = orderItem; this.OrderStatus = orderStatus; this.Topic = itemOrderStatus.ToString(); }
public async Task <Order> ChangeStatus(int orderId, OrderStatusEnum statusEnum) { var order = await this.orderRepository .All() .Where(o => o.Id == orderId) .Include(o => o.OrderStatus) .FirstOrDefaultAsync(); if (order == null) { return(null); } order.OrderStatus = await this.orderStatusService.GetByName(statusEnum.ToString()); this.orderRepository.Update(order); await this.orderRepository.SaveChangesAsync(); return(null); }
private bool saveStatusToDB(OrderStatusEnum status, string machineName = null) { string sLogMsg = string.Format(" - save ORDER {0}/{1}, status = {2}", this.Id, this.Number.ToString(), status.ToString()); DateTime dtTmr = DateTime.Now; if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg + " - START"); } else { AppLib.WriteLogClientAction(machineName, sLogMsg); } // записать в поле QueueStatusId значение для очереди заказов string sqlSetQueueValueText = null; if (status == OrderStatusEnum.Cooking) { sqlSetQueueValueText = "[QueueStatusId] = 0"; } else if ((!_isUseReadyConfirmed && (status == OrderStatusEnum.Ready)) || (_isUseReadyConfirmed && (status == OrderStatusEnum.ReadyConfirmed))) { sqlSetQueueValueText = "[QueueStatusId] = 1"; } else if (status == OrderStatusEnum.Took) { sqlSetQueueValueText = "[QueueStatusId] = 2"; } System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.AppendFormat("UPDATE [Order] SET [OrderStatusId] = {0}", ((int)status).ToString()); if ((sqlSetQueueValueText.IsNull() == false) && (sqlSetQueueValueText.Length > 0)) { sb.Append(", " + sqlSetQueueValueText); } sb.AppendFormat(" WHERE ([Id] = {0})", this.Id.ToString()); string sqlText = sb.ToString(); sb = null; int result = 0; string dbError = null; using (DBContext db = new DBContext()) { result = db.ExecuteCommand(sqlText); dbError = db.ErrMsg; } sLogMsg += " - FINISH - " + (DateTime.Now - dtTmr).ToString(); bool retVal = false; if (result == 1) { retVal = true; sLogMsg += " - Ok"; } else { _serviceErrorMessage = string.Format("Ошибка записи в БД: {0}", dbError); sLogMsg += " - error: " + dbError; } if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg); } else { AppLib.WriteLogClientAction(machineName, sLogMsg); } return(retVal); }
} // method UpdateFromDBEntity // внешнее обновление СОСТОЯНИЯ заказа // параметр isUpdateDishStatus = true, если заказ БЫЛ обновлен ИЗВНЕ (из БД/КДС), то в этом случае дату входа в новое состояние для блюд берем из заказа // isUpdateDishStatus = false, если заказ БУДЕТ обновлен по общему состоянию всех блюд public bool UpdateStatus(OrderStatusEnum newStatus, bool isUpdateDishStatus, string machineName = null) { // если статус не поменялся, то попытаться обновить только статус блюд if (this.Status == newStatus) { return(false); } bool retVal = false; string sLogMsg = string.Format(" - ORDER.UpdateStatus() Id/Num {0}/{1}, from {2} to {3}", this.Id, this.Number, this.Status.ToString(), newStatus.ToString()); DateTime dtTmr = DateTime.Now; if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg + " - START"); } else { AppLib.WriteLogClientAction(machineName, sLogMsg + " - START"); } // время нахождения в ПРЕДЫДУЩЕМ состоянии, в секундах int secondsInPrevState = 0; if (_curTimer != null) // если есть таймер предыдущего состояния { _curTimer.Stop(); // остановить таймер состояния // получить время нахождения в состоянии с момента последнего входа secondsInPrevState = _curTimer.IncrementTS; } // дата входа в новое состояние DateTime dtEnterToNewStatus = DateTime.Now; // обновление заказа по ПОСЛЕДНЕМУ состоянию блюд, если они есть if ((isUpdateDishStatus == false) && (_dishesDict.Values.Count > 0)) { dtEnterToNewStatus = getMaxDishEnterStateDate(newStatus); } // сохранить новый статус ОБЪЕКТА в БД if (saveStatusToDB(newStatus, machineName)) { // изменить статус в ОБЪЕКТЕ OrderStatusEnum preStatus = this.Status; this.Status = newStatus; OrderStatusId = (int)Status; // сохраняем в записи RunTimeRecord дату входа в новое состояние setStatusRunTimeDTS(this.Status, dtEnterToNewStatus, -1); // и время нахождения в предыдущем состоянии setStatusRunTimeDTS(preStatus, DateTime.MinValue, secondsInPrevState); // и в БД saveRunTimeRecord(); // запуск таймера для нового состояния StatusDTS statusDTS = getStatusRunTimeDTS(this.Status); startStatusTimer(statusDTS); // обновить уже существующие блюда при внешнем изменении статуса заказа if (isUpdateDishStatus) { bool dishUpdSuccess = true; // для получения результата обновления через AND try { foreach (OrderDishModel modelDish in _dishesDict.Values) { // только для блюд if (modelDish.ParentUid.IsNull()) { // дату входа в состояние берем из заказа, а время нахожд.в предыд.состоянии из самого блюда dishUpdSuccess &= modelDish.UpdateStatus(newStatus, statusDTS.DateEntered); } } } catch (Exception ex) { AppLib.WriteLogErrorMessage("Ошибка обновления статуса блюд при обновлении статуса заказа {0}/{1} с {2} на {3}: {4}", this.Id, this.Number, this.Status, newStatus, ex.ToString()); dishUpdSuccess = false; } } retVal = true; } sLogMsg += " - FINISH - " + (DateTime.Now - dtTmr).ToString(); if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg); } else { AppLib.WriteLogClientAction(machineName, sLogMsg); } // различные действия после успешного изменения статуса заказа if (retVal) { // создание файла для Одермана (feature enable, ready status is terminal) if (OrdermanNotifier.IsEnable && IsReadyStatusFinal()) { OrdermanNotifier omanNotifier = new OrdermanNotifier(this); bool result = omanNotifier.CreateNoticeFileForOrder(); } } return(retVal); } // method
/// <summary> /// Sets an order status /// </summary> /// <param name="order">Order</param> /// <param name="os">New order status</param> /// <param name="notifyCustomer">True to notify customer</param> protected void SetOrderStatus(Order order, OrderStatusEnum os, bool notifyCustomer) { if (order == null) throw new ArgumentNullException("order"); OrderStatusEnum prevOrderStatus = order.OrderStatus; if (prevOrderStatus == os) return; //set and save new order status order.OrderStatusId = (int)os; UpdateOrder(order); //order notes, notifications InsertOrderNote(order.OrderId, string.Format("Order status has been changed to {0}", os.ToString()), false, DateTime.UtcNow); if (prevOrderStatus != OrderStatusEnum.Complete && os == OrderStatusEnum.Complete && notifyCustomer) { int orderCompletedCustomerNotificationQueuedEmailId = IoC.Resolve<IMessageService>().SendOrderCompletedCustomerNotification(order, order.CustomerLanguageId); if (orderCompletedCustomerNotificationQueuedEmailId > 0) { InsertOrderNote(order.OrderId, string.Format("\"Order completed\" email (to customer) has been queued. Queued email identifier: {0}.", orderCompletedCustomerNotificationQueuedEmailId), false, DateTime.UtcNow); } } if (prevOrderStatus != OrderStatusEnum.Cancelled && os == OrderStatusEnum.Cancelled && notifyCustomer) { int orderCancelledCustomerNotificationQueuedEmailId = IoC.Resolve<IMessageService>().SendOrderCancelledCustomerNotification(order, order.CustomerLanguageId); if (orderCancelledCustomerNotificationQueuedEmailId > 0) { InsertOrderNote(order.OrderId, string.Format("\"Order cancelled\" email (to customer) has been queued. Queued email identifier: {0}.", orderCancelledCustomerNotificationQueuedEmailId), false, DateTime.UtcNow); } } //reward points if (this.RewardPointsEnabled) { if (this.RewardPointsForPurchases_Amount > decimal.Zero) { //Ensure that reward points are applied only to registered users if (order.Customer != null && !order.Customer.IsGuest) { int points = (int)Math.Truncate(order.OrderTotal / this.RewardPointsForPurchases_Amount * this.RewardPointsForPurchases_Points); if (points != 0) { if (this.RewardPointsForPurchases_Awarded == order.OrderStatus) { InsertRewardPointsHistory(order.CustomerId, 0, points, decimal.Zero, decimal.Zero, string.Empty, string.Format(IoC.Resolve<ILocalizationManager>().GetLocaleResourceString("RewardPoints.Message.EarnedForOrder"), order.OrderId), DateTime.UtcNow); } if (this.RewardPointsForPurchases_Canceled == order.OrderStatus) { InsertRewardPointsHistory(order.CustomerId, 0, -points, decimal.Zero, decimal.Zero, string.Empty, string.Format(IoC.Resolve<ILocalizationManager>().GetLocaleResourceString("RewardPoints.Message.ReducedForOrder"), order.OrderId), DateTime.UtcNow); } } } } } //gift cards activation if (this.GiftCards_Activated.HasValue && this.GiftCards_Activated.Value == order.OrderStatus) { var giftCards = GetAllGiftCards(order.OrderId, null, null, null, null, null, null, false, string.Empty); foreach (var gc in giftCards) { bool isRecipientNotified = gc.IsRecipientNotified; switch (gc.PurchasedOrderProductVariant.ProductVariant.GiftCardType) { case (int)GiftCardTypeEnum.Virtual: { //send email for virtual gift card if (!String.IsNullOrEmpty(gc.RecipientEmail) && !String.IsNullOrEmpty(gc.SenderEmail)) { Language customerLang = IoC.Resolve<ILanguageService>().GetLanguageById(order.CustomerLanguageId); if (customerLang == null) customerLang = NopContext.Current.WorkingLanguage; int queuedEmailId = IoC.Resolve<IMessageService>().SendGiftCardNotification(gc, customerLang.LanguageId); if (queuedEmailId > 0) { isRecipientNotified = true; } } } break; case (int)GiftCardTypeEnum.Physical: { } break; default: break; } gc.IsGiftCardActivated = true; gc.IsRecipientNotified = isRecipientNotified; this.UpdateGiftCard(gc); } } //gift cards deactivation if (this.GiftCards_Deactivated.HasValue && this.GiftCards_Deactivated.Value == order.OrderStatus) { var giftCards = GetAllGiftCards(order.OrderId, null, null, null, null, null, null, true, string.Empty); foreach (var gc in giftCards) { gc.IsGiftCardActivated = false; this.UpdateGiftCard(gc); } } }
/// <summary> /// 处理异常,补充收货 /// </summary> /// <param name="supplementList">补充产品list</param> /// <param name="userName">操作人</param> /// <returns></returns> public async Task <Result <int> > supplementReceiveOrder(List <InStorageRecord> supplementList, string userName) { Result <int> result = new Result <int>(); string orderNo = supplementList.First().orderNo; try { using (LayerDbContext context = new LayerDbContext()) { //1.插入入库记录 2.查询本订单下 根据物料group by 应收与实收是否相等,修改订单状态与订单实际总成本 3. 增加库存 var orderModel = context.orderInfo.Where(x => x.orderNo == orderNo).Single(); context.inStorageRecord.AddRange(supplementList); //入库记录中 本订单 各物料的应收实收数量 //DONE: 验证此时的入库记录是否包含补录的记录 不包含 //TODO: left join orderdetailinfo var inStorageRecodes = context.inStorageRecord.Where(x => x.orderNo == orderNo).GroupBy(x => x.materialId).Select(x => new { materialId = x.Key, countReal = x.Sum(item => item.countReal), priceIn = x.Max(item => item.priceIn) }); var inStorageRecodesEntities = (from x in inStorageRecodes join y in context.orderDetailInfo.Where(x => x.orderNo == orderNo) on x.materialId equals y.materialId select new { materialId = x.materialId, priceIn = x.priceIn, countReal = x.countReal, countReference = y.num, }).ToList(); List <InStorageRecord> inStorageRecodeCopy = new List <InStorageRecord>(); InStorageRecord model = null; foreach (var item in inStorageRecodesEntities) { model = new InStorageRecord(); model.materialId = item.materialId; model.priceIn = item.priceIn; model.countReal = item.countReal; model.countReference = item.countReference; inStorageRecodeCopy.Add(model); } //订单状态 OrderStatusEnum status = OrderStatusEnum.completed; //实际进价总和 float sumPriceReal = 0; foreach (var item in supplementList) { inStorageRecodeCopy.Where(x => x.materialId == item.materialId).Single().countReal += item.countReal; } if (inStorageRecodeCopy.Where(x => x.countReal != x.countReference).Count() > 0) { status = OrderStatusEnum.excepted; } sumPriceReal = inStorageRecodeCopy.Sum(x => x.priceIn * x.countReal); orderModel.status = status.ToString(); orderModel.lastUpdatedBy = userName; orderModel.lastUpdatedDate = DateTime.Now; orderModel.sumPriceReal = sumPriceReal; //库存 List <Inventory> inventoryList = new List <Inventory>(); Inventory model1 = null; foreach (var item in supplementList) { model1 = new Inventory() { count = item.countReal, materialId = item.materialId, priceIn = item.priceIn }; inventoryList.Add(model1); } context.inventory.AddRange(inventoryList); await context.SaveChangesAsync(); } } catch (Exception err) { result.addError(err.Message); } return(result); }
public static string Str(this OrderStatusEnum en) { return(en.ToString()); }
private bool saveStatusToDB(OrderStatusEnum status, string machineName = null) { int iStatus = (int)status; string sLogMsg = string.Format(" - save DISH {0}/{1}, status = {2}", this.Id, this.Name, status.ToString()); DateTime dtTmr = DateTime.Now; if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg + " - START"); } else { AppLib.WriteLogClientAction(machineName, sLogMsg); } string sqlText = $"UPDATE [OrderDish] SET [DishStatusId] = {((int)status).ToString()} WHERE ([Id] = {this.Id})"; int result = 0; string dbError = null; using (DBContext db = new DBContext()) { result = db.ExecuteCommand(sqlText); dbError = db.ErrMsg; } sLogMsg += " - FINISH - " + (DateTime.Now - dtTmr).ToString(); bool retVal = false; if (result == 1) { retVal = true; } else if (dbError != null) { sLogMsg += ". Error: " + dbError; _serviceErrorMessage = string.Format("Ошибка записи в БД: {0}", dbError); } if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg); } else { AppLib.WriteLogClientAction(machineName, sLogMsg); } return(retVal); }
} // method // ****************************************** // ОСНОВНАЯ ПРОЦЕДУРА БИЗНЕС-ЛОГИКИ // ПРИ ИЗМЕНЕНИИ СТАТУСА БЛЮДА или НЕЗАВИСИМОГО ИНГРЕДИЕНТА // ****************************************** // команды на изменение статуса блюда могут приходить как от КДС, так и из FrontOffice (при чтении из БД) // состояния и даты сохраняются в БД при каждом изменении // isUpdateParentOrder = true, если запрос на изменение состояния пришел от КДС, иначе запрос из внутренней логики, напр. автоматическое изменение статуса из ожидания в готовку public bool UpdateStatus(OrderStatusEnum newStatus, DateTime dtEnterState = default(DateTime), int preStateTS = 0, string machineName = null) { // если статус не поменялся для существующей записи, то ничего не делать if (this.Status == newStatus) { return(false); } // автоматический переход из Готово в ПодтвГотово: вход в режим отслеживания нахождения в состоянии Готов if ((_isUseReadyConfirmed == true) && (_autoGotoReadyConfirmPeriod > 0) && (newStatus == OrderStatusEnum.Ready) && (this.Status != OrderStatusEnum.Ready)) { _dtReadyStatusInput = DateTime.Now; } string sLogMsg = string.Format(" - DISH.UpdateStatus() Id {0}/{1}, from {2} to {3}", this.Id, this.Name, this.Status.ToString(), newStatus.ToString()); DateTime dtTmr = DateTime.Now; if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg + " - START"); } else { AppLib.WriteLogClientAction(machineName, sLogMsg + " - START"); } bool isUpdSuccess = false; // здесь тоже лочить, т.к. вызовы могут быть как циклческие (ингр.для блюд), так и из заказа / КДС-а lock (this) { // время нахождения в ПРЕДЫДУЩЕМ состоянии, в секундах int secondsInPrevState = 0; if (_curTimer != null) // если есть таймер предыдущего состояния { _curTimer.Stop(); // остановить таймер состояния // получить время нахождения в состоянии с момента последнего входа secondsInPrevState = _curTimer.IncrementTS; // Debug.Print("secondsInPrevState {0}", secondsInPrevState); } if (preStateTS != 0) { secondsInPrevState = preStateTS; } // дата входа в новое состояние: или то, что передано, или текущую DateTime dtEnterToNewStatus = DateTime.Now; // если переданы данные из родительского объекта (заказ или блюдо для ингредиентов) if (!dtEnterState.IsZero()) { dtEnterToNewStatus = dtEnterState; } // сохранить новый статус ОБЪЕКТА в БД if (saveStatusToDB(newStatus, machineName)) { // изменить статус в ОБЪЕКТЕ OrderStatusEnum preStatus = this.Status; this.Status = newStatus; this.DishStatusId = (int)newStatus; // **** запись или в RunTimeRecord или в ReturnTable StatusDTS statusDTS = getStatusRunTimeDTS(this.Status); if (statusDTS.DateEntered.IsZero()) { // сохраняем дату входа в новое состояние setStatusRunTimeDTS(this.Status, dtEnterToNewStatus, -1); // сохраняем в записи RunTimeRecord время нахождения в предыдущем состоянии setStatusRunTimeDTS(preStatus, DateTime.MinValue, secondsInPrevState); saveRunTimeRecord(); } // возврат в предыдущие состояния, создать новую запись в Return table else { saveReturnTimeRecord(preStatus, newStatus, dtEnterToNewStatus, secondsInPrevState); // при возврате из Ready в Cooking обнулять в RunTime-record дату входа в состояние Ready // чтобы при следующем входе в Ready таймер ожидания выноса начал считаться с периода ExpectedTake if (!_isUseReadyConfirmed && (preStatus == OrderStatusEnum.Ready) && (newStatus == OrderStatusEnum.Cooking)) { _dbRunTimeRecord.ReadyDate = DateTime.MinValue; } if (_isUseReadyConfirmed && (preStatus == OrderStatusEnum.ReadyConfirmed) && ((newStatus == OrderStatusEnum.Cooking) || (newStatus == OrderStatusEnum.Ready))) { _dbRunTimeRecord.ReadyConfirmedDate = DateTime.MinValue; } } // запуск таймера для нового состояния statusDTS = getStatusRunTimeDTS(this.Status); startStatusTimer(statusDTS); // попытка обновить статус ЗАКАЗА проверкой состояний всех блюд/ингредиентов _modelOrder.UpdateStatusByVerificationDishes(); isUpdSuccess = true; } } sLogMsg += " - FINISH - " + (DateTime.Now - dtTmr).ToString(); if (machineName == null) { AppLib.WriteLogOrderDetails(sLogMsg); } else { AppLib.WriteLogClientAction(machineName, sLogMsg); } return(isUpdSuccess); } // method UpdateStatus
public bool CreateNoticeFileForOrder() { OrderStatusEnum status = (OrderStatusEnum)_order.OrderStatusId; string logMsg = $"Создание файла-уведомления для заказа № {_order.Number} (id {_order.Id}, status {status.ToString()})..."; writeLogMsg(logMsg); // check notice folder string sResult = null; string folder = (string)AppProperties.GetProperty("NoticeOrdermanFolder"); bool bResult = IntegraLib.AppEnvironment.CheckFolder(folder, out sResult); if (bResult == false) { writeLogMsg(" - " + sResult); return(false); } folder = sResult; bool retVal = false; string fileName = null, fileText = null; OrderStatusEnum toFileStatus = (OrderStatusEnum)_order.OrderStatusId; if (toFileStatus == OrderStatusEnum.ReadyConfirmed) { toFileStatus = OrderStatusEnum.Ready; } fileText = string.Format("Order UID: {1}{0}Order Id: {2}{0}Order Number: {3}{0}Order Status: {4} ({5}){0}Write Time: {7}{0}Waiter Name: {6}{0}Table Name: {8}", Environment.NewLine, _order.Uid, _order.Id, _order.Number, ((int)toFileStatus).ToString(), toFileStatus.ToString(), _order.Waiter, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), _order.TableName); // для терминального состояния Готов ЗАКАЗА if (_order.IsReadyStatusFinal() == true) { fileName = $"{folder}ordNumber_{_order.Number}" + ".txt"; } // иначе вывести в файл-уведомление БЛЮДА в состоянии Готово else { List <OrderDishModel> readyDishes = _order.GetDishesReadyStatFin(); int cnt = readyDishes.Count; if (cnt > 0) { IntegraLib.StringHelper.SBufClear(); foreach (OrderDishModel dish in readyDishes) { logMsg = $" - блюдо '{dish.Name}' id {dish.Id}, status {((OrderStatusEnum)dish.DishStatusId).ToString()}"; writeLogMsg(logMsg); IntegraLib.StringHelper.SBufAppendText(Environment.NewLine + getDishStrForNoticeFile(dish)); } fileText += IntegraLib.StringHelper.SBufGetString(); fileName = $"{folder}ordNumber_{_order.Number} ({cnt.ToString()} dishes)" + ".txt"; } else { writeLogMsg(" - нет блюд в состоянии ГОТОВ"); } } if ((fileName != null) && (fileText != null)) { try { System.IO.File.WriteAllText(fileName, fileText); writeLogMsg($" - файл '{fileName}' создан успешно"); retVal = true; } catch (Exception ex) { writeLogMsg(" - Error: " + ex.Message); } } return(retVal); }
/// <summary> /// Sets an order status /// </summary> /// <param name="orderId">Order identifier</param> /// <param name="os">New order status</param> /// <param name="notifyCustomer">True to notify customer</param> /// <returns>Order</returns> protected static Order SetOrderStatus(int orderId, OrderStatusEnum os, bool notifyCustomer) { var order = GetOrderById(orderId); if (order != null) { if (order.OrderStatus == os) return order; OrderStatusEnum prevOrderStatus = order.OrderStatus; var updatedOrder = UpdateOrder(order.OrderId, order.OrderGuid, order.CustomerId, order.CustomerLanguageId, order.CustomerTaxDisplayType, order.CustomerIP, order.OrderSubtotalInclTax, order.OrderSubtotalExclTax, order.OrderShippingInclTax, order.OrderShippingExclTax, order.PaymentMethodAdditionalFeeInclTax, order.PaymentMethodAdditionalFeeExclTax, order.TaxRates, order.OrderTax, order.OrderTotal, order.RefundedAmount, order.OrderDiscount, order.OrderSubtotalInclTaxInCustomerCurrency, order.OrderSubtotalExclTaxInCustomerCurrency, order.OrderShippingInclTaxInCustomerCurrency, order.OrderShippingExclTaxInCustomerCurrency, order.PaymentMethodAdditionalFeeInclTaxInCustomerCurrency, order.PaymentMethodAdditionalFeeExclTaxInCustomerCurrency, order.TaxRatesInCustomerCurrency, order.OrderTaxInCustomerCurrency, order.OrderTotalInCustomerCurrency, order.OrderDiscountInCustomerCurrency, order.CheckoutAttributeDescription, order.CheckoutAttributesXml, order.CustomerCurrencyCode, order.OrderWeight, order.AffiliateId, os, order.AllowStoringCreditCardNumber, order.CardType, order.CardName, order.CardNumber, order.MaskedCreditCardNumber, order.CardCvv2, order.CardExpirationMonth, order.CardExpirationYear, order.PaymentMethodId, order.PaymentMethodName, order.AuthorizationTransactionId, order.AuthorizationTransactionCode, order.AuthorizationTransactionResult, order.CaptureTransactionId, order.CaptureTransactionResult, order.SubscriptionTransactionId, order.PurchaseOrderNumber, order.PaymentStatus, order.PaidDate, order.BillingFirstName, order.BillingLastName, order.BillingPhoneNumber, order.BillingEmail, order.BillingFaxNumber, order.BillingCompany, order.BillingAddress1, order.BillingAddress2, order.BillingCity, order.BillingStateProvince, order.BillingStateProvinceId, order.BillingZipPostalCode, order.BillingCountry, order.BillingCountryId, order.ShippingStatus, order.ShippingFirstName, order.ShippingLastName, order.ShippingPhoneNumber, order.ShippingEmail, order.ShippingFaxNumber, order.ShippingCompany, order.ShippingAddress1, order.ShippingAddress2, order.ShippingCity, order.ShippingStateProvince, order.ShippingStateProvinceId, order.ShippingZipPostalCode, order.ShippingCountry, order.ShippingCountryId, order.ShippingMethod, order.ShippingRateComputationMethodId, order.ShippedDate, order.DeliveryDate, order.TrackingNumber, order.VatNumber, order.Deleted, order.CreatedOn); //order notes, notifications InsertOrderNote(orderId, string.Format("Order status has been changed to {0}", os.ToString()), false, DateTime.UtcNow); if (prevOrderStatus != OrderStatusEnum.Complete && os == OrderStatusEnum.Complete && notifyCustomer) { int orderCompletedCustomerNotificationQueuedEmailId = MessageManager.SendOrderCompletedCustomerNotification(updatedOrder, updatedOrder.CustomerLanguageId); if (orderCompletedCustomerNotificationQueuedEmailId > 0) { InsertOrderNote(orderId, string.Format("\"Order completed\" email (to customer) has been queued. Queued email identifier: {0}.", orderCompletedCustomerNotificationQueuedEmailId), false, DateTime.UtcNow); } } if (prevOrderStatus != OrderStatusEnum.Cancelled && os == OrderStatusEnum.Cancelled && notifyCustomer) { int orderCancelledCustomerNotificationQueuedEmailId = MessageManager.SendOrderCancelledCustomerNotification(updatedOrder, updatedOrder.CustomerLanguageId); if (orderCancelledCustomerNotificationQueuedEmailId > 0) { InsertOrderNote(orderId, string.Format("\"Order cancelled\" email (to customer) has been queued. Queued email identifier: {0}.", orderCancelledCustomerNotificationQueuedEmailId), false, DateTime.UtcNow); } } //reward points if (OrderManager.RewardPointsEnabled) { if (OrderManager.RewardPointsForPurchases_Amount > decimal.Zero) { int points = (int)Math.Truncate(updatedOrder.OrderTotal / OrderManager.RewardPointsForPurchases_Amount * OrderManager.RewardPointsForPurchases_Points); if (points != 0) { if (OrderManager.RewardPointsForPurchases_Awarded == updatedOrder.OrderStatus) { var rph = InsertRewardPointsHistory(order.CustomerId, 0, points, decimal.Zero, decimal.Zero, string.Empty, string.Format(LocalizationManager.GetLocaleResourceString("RewardPoints.Message.EarnedForOrder"), order.OrderId), DateTime.UtcNow); } if (OrderManager.RewardPointsForPurchases_Canceled == updatedOrder.OrderStatus) { var rph = InsertRewardPointsHistory(order.CustomerId, 0, -points, decimal.Zero, decimal.Zero, string.Empty, string.Format(LocalizationManager.GetLocaleResourceString("RewardPoints.Message.ReducedForOrder"), order.OrderId), DateTime.UtcNow); } } } } //gift cards activation if (OrderManager.GiftCards_Activated.HasValue && OrderManager.GiftCards_Activated.Value == updatedOrder.OrderStatus) { var giftCards = GetAllGiftCards(order.OrderId, null, null,null,null,null,null,false, string.Empty); foreach (var gc in giftCards) { bool isRecipientNotified = gc.IsRecipientNotified; switch (gc.PurchasedOrderProductVariant.ProductVariant.GiftCardType) { case (int)GiftCardTypeEnum.Virtual: { //send email for virtual gift card if (!String.IsNullOrEmpty(gc.RecipientEmail) && !String.IsNullOrEmpty(gc.SenderEmail)) { Language customerLang = LanguageManager.GetLanguageById(updatedOrder.CustomerLanguageId); if (customerLang == null) customerLang = NopContext.Current.WorkingLanguage; int queuedEmailId = MessageManager.SendGiftCardNotification(gc, customerLang.LanguageId); if (queuedEmailId > 0) { isRecipientNotified = true; } } } break; case (int)GiftCardTypeEnum.Physical: { } break; default: break; } OrderManager.UpdateGiftCard(gc.GiftCardId, gc.PurchasedOrderProductVariantId, gc.Amount, true, gc.GiftCardCouponCode, gc.RecipientName, gc.RecipientEmail, gc.SenderName, gc.SenderEmail, gc.Message, isRecipientNotified, gc.CreatedOn); } } //gift cards deactivation if (OrderManager.GiftCards_Deactivated.HasValue && OrderManager.GiftCards_Deactivated.Value == updatedOrder.OrderStatus) { var giftCards = GetAllGiftCards(order.OrderId, null, null, null, null, null, null, true, string.Empty); foreach (var gc in giftCards) { OrderManager.UpdateGiftCard(gc.GiftCardId, gc.PurchasedOrderProductVariantId, gc.Amount, false, gc.GiftCardCouponCode, gc.RecipientName, gc.RecipientEmail, gc.SenderName, gc.SenderEmail, gc.Message, gc.IsRecipientNotified, gc.CreatedOn); } } return updatedOrder; } return null; }
// из обработчика MouseUp объектов DishPanel и OrderPanelHeader internal static void OpenStateChangeWindow(OrderViewModel orderModel, OrderDishViewModel dishModel) { if ((orderModel == null) && (dishModel == null)) { return; } // из РАЗРЕШЕННЫХ переходов выбрать переходы, ДОСТУПНЫЕ для текущего состояния OrderStatusEnum currentState = (OrderStatusEnum)((dishModel == null) ? orderModel.OrderStatusId : dishModel.DishStatusId); KDSModeEnum kdsMode = KDSModeHelper.CurrentKDSMode; // текущий режим КДС List <KeyValuePair <OrderStatusEnum, OrderStatusEnum> > allowedActions = KDSModeHelper.DefinedKDSModes[kdsMode].AllowedActions; if (allowedActions != null) { List <OrderStatusEnum> allowedStates = allowedActions.Where(p => (p.Key == currentState)).Select(p => p.Value).ToList(); // при клике по ЗАКАЗУ проверить статус отображаемых на данном КДСе позиций if (dishModel == null) { OrderStatusEnum statAllDishes = (OrderStatusEnum)(int)orderModel.StatusAllowedDishes; //AppLib.GetStatusAllDishes(orderModel.Dishes); if (orderModel.StatusAllowedDishes != StatusEnum.None) { currentState = statAllDishes; // текущее состояние - по блюдам! // и, если в разрешенных переходах есть пары с таким ключем, т.е. ВСЕ блюда находятся в состоянии, которое есть в разрешенных переходах var tmpList = allowedActions.Where(s => s.Key == statAllDishes).ToList(); // то отображаем эти переходы, а не переходы из состояния заказа! if (tmpList != null) { allowedStates = tmpList.Select(p => p.Value).ToList(); } } } StringBuilder sb = new StringBuilder(); allowedStates.ForEach(status => sb.Append(status.ToString())); AppLib.WriteLogClientAction("Open StateChange win, allowedStates: " + sb.ToString()); // открываем окно изменения статуса if (allowedStates.Count != 0) { StateChange win = (StateChange)WpfHelper.GetAppGlobalValue("StateChangeWindow"); win.CurrentState = currentState; win.Order = orderModel; win.Dish = dishModel; win.AllowedStates = allowedStates; WpfHelper.SetWinSizeToMainWinSize(win); win.ShowDialog(); AppLib.WriteLogClientAction("Close StateChange win, result: {0}", win.CurrentState.ToString()); // изменить статус AppDataProvider dataProvider = (AppDataProvider)WpfHelper.GetAppGlobalValue("AppDataProvider"); OrderStatusEnum newState = win.CurrentState; if ((newState != OrderStatusEnum.None) && (newState != currentState) && (dataProvider != null)) { string sLogMsg; bool result = false; bool finReady = getFinReadyValue(newState); // флаг терминального окончания готовки #region изменение статуса try { // проверить set-канал if (!dataProvider.EnableSetChannel) { dataProvider.CreateSetChannel(); } if (!dataProvider.EnableSetChannel) { dataProvider.CreateSetChannel(); } // изменение состояния БЛЮДА и разрешенных ингредиентов (2017-07-26) if (dishModel != null) { sLogMsg = string.Format("orderId {0} (num {1}) for change status dishId {2} ({3}) to {4}", orderModel.Id, orderModel.Number, dishModel.Id, dishModel.DishName, newState.ToString()); DateTime dtTmr = DateTime.Now; if (dataProvider.LockOrder(orderModel.Id)) { AppLib.WriteLogClientAction("lock " + sLogMsg + ": success"); OrderStatusEnum preState = dishModel.Status; // изменить статус блюда с ингредиентами result = changeStatusDishWithIngrs(dataProvider, orderModel, dishModel, newState); string sBuf = "delock " + sLogMsg + " - " + (DateTime.Now - dtTmr).ToString(); if (dataProvider.DelockOrder(orderModel.Id)) { AppLib.WriteLogClientAction(sBuf + ": success"); } else { AppLib.WriteLogClientAction(sBuf + ": NOT success"); } } else { AppLib.WriteLogClientAction("lock " + sLogMsg + ": NOT success"); } } // изменение состояния ЗАКАЗА, то изменяем все равно поблюдно else if (dishModel == null) { sLogMsg = string.Format("orderId {0} (num {1}) for change order status to {2}", orderModel.Id, orderModel.Number, newState.ToString()); DateTime dtTmr = DateTime.Now; if (dataProvider.LockOrder(orderModel.Id)) { AppLib.WriteLogClientAction("lock " + sLogMsg + ": success"); List <int> dishIds = new List <int>(); // dishes id has changed // меняем статус БЛЮД в заказе, если блюдо разрешено для данного КДСа foreach (OrderDishViewModel item in orderModel.Dishes.Where(d => d.ParentUID.IsNull())) { if (DishesFilter.Instance.Checked(item)) { // изменить статус блюда с ингредиентами result = changeStatusDishWithIngrs(dataProvider, orderModel, item, newState); if (result) { dishIds.Add(item.Id); } } } // foreach string sBuf = "delock " + sLogMsg + " - " + (DateTime.Now - dtTmr).ToString(); if (dataProvider.DelockOrder(orderModel.Id)) { AppLib.WriteLogClientAction(sBuf + ": success"); } else { AppLib.WriteLogClientAction(sBuf + ": NOT success"); } } else { AppLib.WriteLogClientAction("lock " + sLogMsg + ": NOT success"); } } // order status } catch (Exception ex) { AppLib.WriteLogErrorMessage(ex.ToString()); MessageBox.Show("Ошибка изменения состояния. Попробуйте еще раз.", "Ошибка записи нового состояния", MessageBoxButton.OK); } #endregion } } // if (allowedStates.Count != 0) } // if (allowedActions != null) } // method
} //For EF private OrderStatuses(OrderStatusEnum @enum) { this.Id = (int)@enum; this.StatusName = @enum.ToString(); }
/// <summary> /// Sets an order status /// </summary> /// <param name="OrderID">Order identifier</param> /// <param name="OS">New order status</param> /// <param name="notifyCustomer">True to notify customer</param> /// <returns>Order</returns> protected static Order SetOrderStatus(int OrderID, OrderStatusEnum OS, bool notifyCustomer) { Order order = GetOrderByID(OrderID); if (order != null) { if (order.OrderStatus == OS) return order; InsertOrderNote(OrderID, string.Format("Order status has been changed to {0}", OS.ToString()), DateTime.Now); if (order.OrderStatus != OrderStatusEnum.Complete && OS == OrderStatusEnum.Complete && notifyCustomer) { int orderCompletedCustomerNotificationQueuedEmailID = MessageManager.SendOrderCompletedCustomerNotification(order, order.CustomerLanguageID); InsertOrderNote(OrderID, string.Format("\"Order completed\" email (to customer) has been queued. Queued email identifier: {0}.", orderCompletedCustomerNotificationQueuedEmailID), DateTime.Now); } if (order.OrderStatus != OrderStatusEnum.Cancelled && OS == OrderStatusEnum.Cancelled && notifyCustomer) { int orderCancelledCustomerNotificationQueuedEmailID = MessageManager.SendOrderCancelledCustomerNotification(order, order.CustomerLanguageID); InsertOrderNote(OrderID, string.Format("\"Order cancelled\" email (to customer) has been queued. Queued email identifier: {0}.", orderCancelledCustomerNotificationQueuedEmailID), DateTime.Now); } order = UpdateOrder(order.OrderID, order.OrderGUID, order.CustomerID, order.CustomerLanguageID, order.CustomerTaxDisplayType, order.OrderSubtotalInclTax, order.OrderSubtotalExclTax, order.OrderShippingInclTax, order.OrderShippingExclTax, order.PaymentMethodAdditionalFeeInclTax, order.PaymentMethodAdditionalFeeExclTax, order.OrderTax, order.OrderTotal, order.OrderDiscount, order.OrderSubtotalInclTaxInCustomerCurrency, order.OrderSubtotalExclTaxInCustomerCurrency, order.OrderShippingInclTaxInCustomerCurrency, order.OrderShippingExclTaxInCustomerCurrency, order.PaymentMethodAdditionalFeeInclTaxInCustomerCurrency, order.PaymentMethodAdditionalFeeExclTaxInCustomerCurrency, order.OrderTaxInCustomerCurrency, order.OrderTotalInCustomerCurrency, order.CustomerCurrencyCode, order.OrderWeight, order.AffiliateID, OS, order.AllowStoringCreditCardNumber, order.CardType, order.CardName, order.CardNumber, order.MaskedCreditCardNumber, order.CardCVV2, order.CardExpirationMonth, order.CardExpirationYear, order.PaymentMethodID, order.PaymentMethodName, order.AuthorizationTransactionID, order.AuthorizationTransactionCode, order.AuthorizationTransactionResult, order.CaptureTransactionID, order.CaptureTransactionResult, order.PurchaseOrderNumber, order.PaymentStatus, order.BillingFirstName, order.BillingLastName, order.BillingPhoneNumber, order.BillingEmail, order.BillingFaxNumber, order.BillingCompany, order.BillingAddress1, order.BillingAddress2, order.BillingCity, order.BillingStateProvince, order.BillingStateProvinceID, order.BillingZipPostalCode, order.BillingCountry, order.BillingCountryID, order.ShippingStatus, order.ShippingFirstName, order.ShippingLastName, order.ShippingPhoneNumber, order.ShippingEmail, order.ShippingFaxNumber, order.ShippingCompany, order.ShippingAddress1, order.ShippingAddress2, order.ShippingCity, order.ShippingStateProvince, order.ShippingStateProvinceID, order.ShippingZipPostalCode, order.ShippingCountry, order.ShippingCountryID, order.ShippingMethod, order.ShippingRateComputationMethodID, order.ShippedDate, order.Deleted, order.CreatedOn); } return order; }
// создание файла уведомления о состоянии БЛЮДА // для заказа создается файл [номер заказа].txt, для блюда - [номер заказа]([id блюда]).txt // для блюда, не ингредиента, только, если сам заказ еще не готов и NoticeOrdermanDishNotice = 1 (создавать файл-уведомления для блюда) public bool CreateNoticeFileForDishes(string orderDishIds) { string logMsg = $"Создание файла состояния для блюд/id {orderDishIds} заказа № {_order.Number} (id {_order.Id})..."; writeLogMsg(logMsg); if (orderDishIds.IsNull()) { writeLogMsg(" - перечень id блюд - пустой!"); return(false); } // check notice folder string sResult = null; string folder = (string)AppProperties.GetProperty("NoticeOrdermanFolder"); bool bResult = IntegraLib.AppEnvironment.CheckFolder(folder, out sResult); if (bResult == false) { writeLogMsg(" - " + sResult); return(false); } folder = sResult; bool retVal = false; string fileName = null, fileText = null; OrderStatusEnum toFileStatus = (OrderStatusEnum)_order.OrderStatusId; if (toFileStatus == OrderStatusEnum.ReadyConfirmed) { toFileStatus = OrderStatusEnum.Ready; } fileText = string.Format("Order UID: {1}{0}Order Id: {2}{0}Order Number: {3}{0}Order Status: {4} ({5}){0}Waiter Name: {6}", Environment.NewLine, _order.Uid, _order.Id, _order.Number, ((int)toFileStatus).ToString(), toFileStatus.ToString(), _order.Waiter); int[] ids = orderDishIds.Split(';').Select(s => s.ToInt()).ToArray(); if (ids.Length > 0) { IntegraLib.StringHelper.SBufClear(); OrderDishModel dish; foreach (int dishId in ids) { if (_order.Dishes.ContainsKey(dishId)) { dish = _order.Dishes[dishId]; IntegraLib.StringHelper.SBufAppendText(Environment.NewLine + getDishStrForNoticeFile(dish)); } } fileText += IntegraLib.StringHelper.SBufGetString(); fileName = $"{folder}ordNumber_{_order.Number} (dishes {orderDishIds})" + ".txt"; try { System.IO.File.WriteAllText(fileName, fileText); writeLogMsg($" - файл '{fileName}' создан успешно"); retVal = true; } catch (Exception ex) { writeLogMsg(" - Error: " + ex.Message); } } return(retVal); }