// ПОЛНОЕ ОБНОВЛЕНИЕ заказа из БД-сущности (вместе с блюдами) 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
//************************************** // ГЛАВНАЯ ПРОЦЕДУРА ОБНОВЛЕНИЯ ЗАКАЗОВ // здесь пишем в лог при включенном флаге TraceOrdersDetails // возвращает текст ошибки //************************************** public string UpdateOrders() { string sLog = ""; #region автосброс вчерашних заказов if (_changeStatusYesterdayOrdersCfg) { if (_changeStatusYesterdayOrdersCurrent) { if (updateYesterdayOrdersStatus()) { // для одноразового прохода в течение дня _changeStatusYesterdayOrdersCurrent = false; if (_currentDate != DateTime.Today) { _currentDate = DateTime.Today; } } } // текущий флаг обновления вчерашних заказов сброшен и переползли в новые сутки else if (_currentDate != DateTime.Today) { // устанавливаем флажок, чтобы при следующем проходе, попытаться обновить статус вчерашних заказов _changeStatusYesterdayOrdersCurrent = true; } } #endregion AppLib.WriteLogOrderDetails("GET ORDERS FROM DB - START"); Console.Write("getting orders ..."); DebugTimer.Init(" - get orders from DB", false); // получить заказы из БД string errMsg = null; try { DBOrderHelper.LoadDBOrders(); errMsg = DBOrderHelper.ErrorMessage; } catch (Exception ex) { errMsg = ErrorHelper.GetShortErrMessage(ex); } if (errMsg != null) { return(errMsg); } // получено заказов из БД if (_isLogOrderDetails) { string ids = (_dbOrders.Count > 50) ? "> 50" : getOrdersLogString(_dbOrders); AppLib.WriteLogOrderDetails(" - from DB {0} id/Num/dishes: {1}", _dbOrders.Count, ids); } // цикл по полученным из БД заказам if (_dbOrders != null) { #region *** ОБНОВЛЕНИЕ ВНУТРЕННЕГО СЛОВАРЯ ЗАКАЗОВ _orders коллекцией из БД _dbOrders *** // 1. удалить из _orders те заказы, который уже нет в БД, кроме заблокированных int[] delIds = _orders.Keys .Except(_dbOrders.Select(o => o.Id)) .Except(OrderLocker.GetLockedOrders()) .ToArray(); if (_isLogOrderDetails) { string s1 = ""; if (delIds.Length > 0) { s1 = string.Join(",", delIds); } if (s1 != "") { AppLib.WriteLogOrderDetails(" appModel: remove order Ids {0}", s1); } } foreach (int id in delIds) { _orders[id].Dispose(); _orders.Remove(id); } // 2. обновить или добавить int iCnt = 0; foreach (Order dbOrder in _dbOrders) { iCnt++; // пропустить, если заказ заблокирован от изменений по таймеру при длительных операциях чтения из БД if (OrderLocker.IsLockOrder(dbOrder.Id)) { AppLib.WriteLogOrderDetails(" appModel: locked order Id " + dbOrder.Id.ToString()); // если заказ стал неотображаемый, то удалить его из коллекции if (_orders.ContainsKey(dbOrder.Id)) { OrderModel om = _orders[dbOrder.Id]; if (_allowedKDSStatuses.Contains(om.OrderStatusId) == false) { _orders.Remove(dbOrder.Id); AppLib.WriteLogOrderDetails(" remove from appModel set"); } } continue; } if (_orders.ContainsKey(dbOrder.Id)) { //sLog = string.Format(" appModel: update {0}/{1}", dbOrder.Id, dbOrder.Number); //AppEnv.WriteLogOrderDetails(sLog + " - START"); //_tmpDT = DateTime.Now; try { _orders[dbOrder.Id].UpdateFromDBEntity(dbOrder); } catch (Exception ex) { AppLib.WriteLogErrorMessage("Ошибка обновления служебного словаря для OrderId = {1}: {0}", ex.ToString(), dbOrder.Id); } //AppEnv.WriteLogOrderDetails(sLog + " - FINISH - " + _tmpPeriod()); } // добавление заказа в словарь else { sLog = string.Format(" appModel: add new {0}/{1}", dbOrder.Id, dbOrder.Number); AppLib.WriteLogOrderDetails(sLog + " - START"); _tmpDT = DateTime.Now; try { OrderModel newOrder = new OrderModel(dbOrder); _orders.Add(dbOrder.Id, newOrder); } catch (Exception ex) { AppLib.WriteLogErrorMessage("Ошибка добавления заказа в служебный словарь: {0}", ex.ToString()); } AppLib.WriteLogOrderDetails(sLog + " - FINISH - " + _tmpPeriod()); } //curOrder } // foreach #endregion #region обновить словарь блюд с их количеством, которые ожидают готовки или уже готовятся sLog = " updateDishesQuantityDict()..."; AppLib.WriteLogOrderDetails(sLog); try { updateDishesQuantityDict(_orders); if (_isLogOrderDetails) { AppLib.WriteLogOrderDetails(" - result (depId/count): " + getDishesQtyString()); } // проверяем условие автоматического перехода в режим приготовления checkAutoStartCooking(_orders); } catch (Exception ex) { if (_isLogOrderDetails) { AppLib.WriteLogOrderDetails(" error: " + ex.ToString()); } else { AppLib.WriteLogErrorMessage("Ошибка обновления словаря количества готовящихся блюд по цехам: " + ex.ToString()); } } #endregion } if (_isLogOrderDetails) { string ids = (_dbOrders.Count > 50) ? "> 50" : getOrdersLogString(_orders.Values); AppLib.WriteLogOrderDetails(" - to clients {0} id/Num/dishes: {1}", _orders.Count, ids); } AppLib.WriteLogOrderDetails("get orders from DB - FINISH" + " - " + DebugTimer.GetInterval()); Console.WriteLine(" - " + _orders.Count.ToString() + " " + DebugTimer.GetInterval()); return(null); } // method