Exemplo n.º 1
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