Пример #1
0
        // ПОЛНОЕ ОБНОВЛЕНИЕ заказа из БД-сущности (вместе с блюдами)
        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
Пример #2
0
        //**************************************
        // ГЛАВНАЯ ПРОЦЕДУРА ОБНОВЛЕНИЯ ЗАКАЗОВ
        // здесь пишем в лог при включенном флаге 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