// для ингредиента попытаться обновить статус блюда по всем ингредиентам private void updateDishStatusByIngrStatuses() { OrderDishModel parentDish = getParentDish(); if (parentDish != null) { List <OrderDishModel> ingrs = getIngredients(); int iLen = Enum.GetValues(typeof(OrderStatusEnum)).Length; int[] statArray = new int[iLen]; int iStatus, iDishesCount = ingrs.Count; foreach (OrderDishModel modelDish in ingrs) { iStatus = modelDish.DishStatusId; statArray[iStatus]++; } // в состояние 0 заказ автоматом переходить не должен for (int i = 1; i < iLen; i++) { if (statArray[i] == iDishesCount) { OrderStatusEnum statDishes = AppLib.GetStatusEnumFromNullableInt(i); if (parentDish.Status != statDishes) { parentDish.UpdateStatus(statDishes); } break; } } } }
public OrderDishModel Copy() { OrderDishModel retVal = (OrderDishModel)this.MemberwiseClone(); retVal._tsTimersDict = null; retVal._curTimer = this._curTimer; retVal._dbRunTimeRecord = null; return(retVal); }
// обновить добавленный к списку зависимый ингредиент по родительскому блюду // т.е. для нового объекта в заказе private void updateIngredientByParentDish() { // найти уже существующее блюдо для данного ингредиента _parentDish = getParentDish(); if (_parentDish != null) { StatusDTS dtsBase = _parentDish.getStatusRunTimeDTS(_parentDish.Status); // и если оно поменялось, то обновляем статус ингредиента if (this.DishStatusId != _parentDish.DishStatusId) { StatusDTS preDtsBase = _parentDish.getStatusRunTimeDTS(this.Status); UpdateStatus(_parentDish.Status, dtsBase.DateEntered, preDtsBase.TimeStanding); } else { setStatusRunTimeDTS(this.Status, dtsBase.DateEntered, -1); saveRunTimeRecord(); startStatusTimer(dtsBase); } } }
// ПОЛНОЕ ОБНОВЛЕНИЕ заказа из БД-сущности (вместе с блюдами) public void UpdateFromDBEntity(Order dbOrder) { lock (this) { if (Uid != dbOrder.UID) { Uid = dbOrder.UID; } if (Number != dbOrder.Number) { Number = dbOrder.Number; } if (TableName != dbOrder.TableNumber) { TableName = dbOrder.TableNumber; } if (CreateDate != dbOrder.CreateDate) { CreateDate = dbOrder.CreateDate; } if (HallName != dbOrder.RoomNumber) { HallName = dbOrder.RoomNumber; } if (Waiter != dbOrder.Waiter) { Waiter = dbOrder.Waiter; } if (DivisionColorRGB != dbOrder.DivisionColorRGB) { DivisionColorRGB = dbOrder.DivisionColorRGB; } OrderStatusEnum newStatus = AppLib.GetStatusEnumFromNullableInt(dbOrder.OrderStatusId); if (dbOrder.OrderStatusId < 1) { newStatus = OrderStatusEnum.Cooking; saveStatusToDB(newStatus); } UpdateStatus(newStatus, false); // *** СЛОВАРЬ БЛЮД *** // удалить блюда из внутр.модели заказа, которых уже нет в БД и которые НЕЗАБЛОКИРОВАНЫ List <int> idDishList = dbOrder.Dishes.Select(d => d.Id).ToList(); // все Id блюд из БД List <int> idForRemove = _dishesDict.Keys.Except(idDishList).ToList(); // Id блюд для удаления foreach (int idDish in idForRemove) { if (OrderLocker.IsLockDish(idDish)) { continue; } _dishesDict[idDish].Dispose(); _dishesDict.Remove(idDish); } _isUpdStatusFromDishes = false; // обновить состояние или добавить блюда foreach (OrderDish dbDish in dbOrder.Dishes) { // пропустить, если блюдо находится в словаре заблокированных от изменения по таймеру if (OrderLocker.IsLockDish(dbDish.Id)) { continue; } if (this._dishesDict.ContainsKey(dbDish.Id)) // есть такое блюдо во внут.словаре - обновить из БД { this._dishesDict[dbDish.Id].UpdateFromDBEntity(dbDish); } // иначе - добавить блюдо/ингр else { OrderDishModel newDish = new OrderDishModel(dbDish, this); this._dishesDict.Add(newDish.Id, newDish); } } } // lock } // method UpdateFromDBEntity
// *** CONSTRUCTOR *** public OrderModel(Order dbOrder) { Id = dbOrder.Id; Uid = dbOrder.UID; Number = dbOrder.Number; TableName = dbOrder.TableNumber; CreateDate = dbOrder.CreateDate; HallName = dbOrder.RoomNumber; Waiter = dbOrder.Waiter; DivisionColorRGB = dbOrder.DivisionColorRGB; OrderStatusId = dbOrder.OrderStatusId; Status = (OrderStatusEnum)dbOrder.OrderStatusId; //AppLib.GetStatusEnumFromNullableInt(dbOrder.OrderStatusId); _isUseReadyConfirmed = AppProperties.GetBoolProperty("UseReadyConfirmedState"); _dishesDict = new Dictionary <int, OrderDishModel>(); // получить отсоединенную RunTime запись из таблицы состояний _dbRunTimeRecord = getOrderRunTimeRecord(dbOrder.Id); // создать словарь накопительных счетчиков _tsTimersDict = new Dictionary <OrderStatusEnum, TimeCounter>(); // таймер времени приготовления _tsTimersDict.Add(OrderStatusEnum.Cooking, new TimeCounter() { Name = OrderStatusEnum.Cooking.ToString() }); // таймер времени ожидания выдачи, нахождение в состоянии Готов _tsTimersDict.Add(OrderStatusEnum.Ready, new TimeCounter() { Name = OrderStatusEnum.Ready.ToString() }); if (_isUseReadyConfirmed) { _tsTimersDict.Add(OrderStatusEnum.ReadyConfirmed, new TimeCounter() { Name = OrderStatusEnum.ReadyConfirmed.ToString() }); } // таймер времени ожидания фиксации заказа, нахождение в состоянии Выдано _tsTimersDict.Add(OrderStatusEnum.Took, new TimeCounter() { Name = OrderStatusEnum.Took.ToString() }); // таймер нахождения в состоянии отмены _tsTimersDict.Add(OrderStatusEnum.Cancelled, new TimeCounter() { Name = OrderStatusEnum.Cancelled.ToString() }); // для нового объекта статус по умолчанию - В ПРОЦЕССЕ ГОТОВКИ if (this.OrderStatusId < 1) { OrderStatusEnum newStatus = OrderStatusEnum.Cooking; UpdateStatus(newStatus, false); } else { // обновить статус заказа по статусам всех блюд OrderStatusEnum eStatusAllDishes = AppLib.GetStatusAllDishes(dbOrder.Dishes); if ((eStatusAllDishes != OrderStatusEnum.None) && (this.Status != eStatusAllDishes) && ((int)this.Status < (int)eStatusAllDishes)) { UpdateStatus(eStatusAllDishes, false); } } StatusDTS statusDTS = getStatusRunTimeDTS(this.Status); DateTime dtEnterState = statusDTS.DateEntered; if (dtEnterState.IsZero()) { dtEnterState = DateTime.Now; setStatusRunTimeDTS(this.Status, dtEnterState, -1); saveRunTimeRecord(); statusDTS = getStatusRunTimeDTS(this.Status); } startStatusTimer(statusDTS); // добавить блюда к заказу // расставить сначала блюдо, потом его ингредиенты, т.к. ингр.могут идти ПЕРЕД блюдом List <OrderDish> dishParentList = dbOrder.Dishes.Where(d => d.ParentUid.IsNull()).ToList(); Dictionary <int, OrderDish> dAll = new Dictionary <int, OrderDish>(); foreach (OrderDish dishParent in dishParentList) { if (dAll.ContainsKey(dishParent.Id) == false) { dAll.Add(dishParent.Id, dishParent); // отобрать ингредиенты List <OrderDish> ingrList = dbOrder.Dishes.Where(ingr => (ingr.ParentUid == dishParent.UID) && (ingr.Id != dishParent.Id)).ToList(); foreach (OrderDish ingr in ingrList) { if (dAll.ContainsKey(ingr.Id) == false) { dAll.Add(ingr.Id, ingr); } } } } foreach (OrderDish dbDish in dAll.Values) // dbOrder.OrderDish { if (this._dishesDict.ContainsKey(dbDish.Id) == false) { OrderDishModel newDish = new OrderDishModel(dbDish, this); this._dishesDict.Add(newDish.Id, newDish); } } } // ctor
public DishWithQty(OrderDishModel dishModel) { this.DishModel = dishModel; this.Quantity = dishModel.Quantity; }