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