// РАЗРЕШЕННЫЕ СОСТОЯНИЯ public static List <OrderStatusEnum> GetKDSModeAllowedStates(KDSModeEnum kdsMode) { if (_definedKDSModes.ContainsKey(kdsMode)) { return(_definedKDSModes[kdsMode].AllowedStates); } else { return(null); } }
// из обработчика MouseUp объектов DishPanel и OrderPanelHeader internal static void OpenStateChangeWindow(OrderViewModel orderModel, OrderDishViewModel dishModel) { if ((orderModel == null) && (dishModel == null)) { return; } // из РАЗРЕШЕННЫХ переходов выбрать переходы, ДОСТУПНЫЕ для текущего состояния OrderStatusEnum currentState = (OrderStatusEnum)((dishModel == null) ? orderModel.OrderStatusId : dishModel.DishStatusId); KDSModeEnum kdsMode = KDSModeHelper.CurrentKDSMode; // текущий режим КДС List <KeyValuePair <OrderStatusEnum, OrderStatusEnum> > allowedActions = KDSModeHelper.DefinedKDSModes[kdsMode].AllowedActions; if (allowedActions != null) { List <OrderStatusEnum> allowedStates = allowedActions.Where(p => (p.Key == currentState)).Select(p => p.Value).ToList(); // при клике по ЗАКАЗУ проверить статус отображаемых на данном КДСе позиций if (dishModel == null) { OrderStatusEnum statAllDishes = (OrderStatusEnum)(int)orderModel.StatusAllowedDishes; //AppLib.GetStatusAllDishes(orderModel.Dishes); if (orderModel.StatusAllowedDishes != StatusEnum.None) { currentState = statAllDishes; // текущее состояние - по блюдам! // и, если в разрешенных переходах есть пары с таким ключем, т.е. ВСЕ блюда находятся в состоянии, которое есть в разрешенных переходах var tmpList = allowedActions.Where(s => s.Key == statAllDishes).ToList(); // то отображаем эти переходы, а не переходы из состояния заказа! if (tmpList != null) { allowedStates = tmpList.Select(p => p.Value).ToList(); } } } StringBuilder sb = new StringBuilder(); allowedStates.ForEach(status => sb.Append(status.ToString())); AppLib.WriteLogClientAction("Open StateChange win, allowedStates: " + sb.ToString()); // открываем окно изменения статуса if (allowedStates.Count != 0) { StateChange win = (StateChange)WpfHelper.GetAppGlobalValue("StateChangeWindow"); win.CurrentState = currentState; win.Order = orderModel; win.Dish = dishModel; win.AllowedStates = allowedStates; WpfHelper.SetWinSizeToMainWinSize(win); win.ShowDialog(); AppLib.WriteLogClientAction("Close StateChange win, result: {0}", win.CurrentState.ToString()); // изменить статус AppDataProvider dataProvider = (AppDataProvider)WpfHelper.GetAppGlobalValue("AppDataProvider"); OrderStatusEnum newState = win.CurrentState; if ((newState != OrderStatusEnum.None) && (newState != currentState) && (dataProvider != null)) { string sLogMsg; bool result = false; bool finReady = getFinReadyValue(newState); // флаг терминального окончания готовки #region изменение статуса try { // проверить set-канал if (!dataProvider.EnableSetChannel) { dataProvider.CreateSetChannel(); } if (!dataProvider.EnableSetChannel) { dataProvider.CreateSetChannel(); } // изменение состояния БЛЮДА и разрешенных ингредиентов (2017-07-26) if (dishModel != null) { sLogMsg = string.Format("orderId {0} (num {1}) for change status dishId {2} ({3}) to {4}", orderModel.Id, orderModel.Number, dishModel.Id, dishModel.DishName, newState.ToString()); DateTime dtTmr = DateTime.Now; if (dataProvider.LockOrder(orderModel.Id)) { AppLib.WriteLogClientAction("lock " + sLogMsg + ": success"); OrderStatusEnum preState = dishModel.Status; // изменить статус блюда с ингредиентами result = changeStatusDishWithIngrs(dataProvider, orderModel, dishModel, newState); string sBuf = "delock " + sLogMsg + " - " + (DateTime.Now - dtTmr).ToString(); if (dataProvider.DelockOrder(orderModel.Id)) { AppLib.WriteLogClientAction(sBuf + ": success"); } else { AppLib.WriteLogClientAction(sBuf + ": NOT success"); } } else { AppLib.WriteLogClientAction("lock " + sLogMsg + ": NOT success"); } } // изменение состояния ЗАКАЗА, то изменяем все равно поблюдно else if (dishModel == null) { sLogMsg = string.Format("orderId {0} (num {1}) for change order status to {2}", orderModel.Id, orderModel.Number, newState.ToString()); DateTime dtTmr = DateTime.Now; if (dataProvider.LockOrder(orderModel.Id)) { AppLib.WriteLogClientAction("lock " + sLogMsg + ": success"); List <int> dishIds = new List <int>(); // dishes id has changed // меняем статус БЛЮД в заказе, если блюдо разрешено для данного КДСа foreach (OrderDishViewModel item in orderModel.Dishes.Where(d => d.ParentUID.IsNull())) { if (DishesFilter.Instance.Checked(item)) { // изменить статус блюда с ингредиентами result = changeStatusDishWithIngrs(dataProvider, orderModel, item, newState); if (result) { dishIds.Add(item.Id); } } } // foreach string sBuf = "delock " + sLogMsg + " - " + (DateTime.Now - dtTmr).ToString(); if (dataProvider.DelockOrder(orderModel.Id)) { AppLib.WriteLogClientAction(sBuf + ": success"); } else { AppLib.WriteLogClientAction(sBuf + ": NOT success"); } } else { AppLib.WriteLogClientAction("lock " + sLogMsg + ": NOT success"); } } // order status } catch (Exception ex) { AppLib.WriteLogErrorMessage(ex.ToString()); MessageBox.Show("Ошибка изменения состояния. Попробуйте еще раз.", "Ошибка записи нового состояния", MessageBoxButton.OK); } #endregion } } // if (allowedStates.Count != 0) } // if (allowedActions != null) } // method
// РАЗРЕШЕННЫЕ ПЕРЕХОДЫ МЕЖДУ СОСТОЯНИЯМИ public static List <KeyValuePair <OrderStatusEnum, OrderStatusEnum> > GetKDSModeAllowedActions(KDSModeEnum kdsMode) { if (_definedKDSModes.ContainsKey(kdsMode)) { return(_definedKDSModes[kdsMode].AllowedActions); } else { return(null); } }
} // method private void btnSave_Click(object sender, RoutedEventArgs e) { // *** получить напрямую новые значения *** // новые значения из списков _cfgValKeeper.PutNewValueDirectly("depUIDs", getIsViewDepIds()); // роль КДС из контролов KDSModeEnum eMode = getKDSModeFromRadioButtons(); if (eMode != KDSModeEnum.None) { _cfgValKeeper.PutNewValueDirectly("KDSMode", eMode.ToString()); string sStates, sActions; if (eMode == KDSModeEnum.Special) { // получить новые объектные значения разрешений List <OrderStatusEnum> newAllowedStates = getStatesFromCheckBoxes(pnlStates); List <KeyValuePair <OrderStatusEnum, OrderStatusEnum> > newAllowedActions = getActionsFromCheckBoxes(pnlActions); sStates = KDSModeHelper.StatesListToString(newAllowedStates); if (sStates == null) { sStates = ""; } sActions = KDSModeHelper.ActionsListToString(newAllowedActions); if (sActions == null) { sActions = ""; } } else { sStates = ""; sActions = ""; } // записать их новые значения в кипер _cfgValKeeper.PutNewValueDirectly("KDSModeSpecialStates", sStates); _cfgValKeeper.PutNewValueDirectly("KDSModeSpecialActions", sActions); } _cfgValKeeper.PutNewValueDirectly("NewOrderAudioAttention", (string)cbxSelectAudio.SelectedValue); // *** получить новые значения из контролов *** _cfgValKeeper.PutNewValueFromControls(); // собрать словарь новых значений _appNewSettings = _cfgValKeeper.GetNewValuesDict(); // сделаны ли какие-нибудь изменения? if (_appNewSettings.Count > 0) { string errMsg = null; string sBuf; if (CfgFileHelper.SaveAppSettings(_appNewSettings, out errMsg)) // сохранить в config-файле (все в символьном виде) { // для объектов, взятых из AppProps, сохранить туда _cfgValKeeper.SaveToAppProps(); // для некоторых значений может понадобиться преобразование типов для сохранения в App.Properties if (_appNewSettings.ContainsKey("KDSMode") && (_appNewSettings["KDSMode"].IsNull() == false)) { if (Enum.TryParse <KDSModeEnum>(_appNewSettings["KDSMode"], out eMode)) { KDSModeHelper.CurrentKDSMode = eMode; } } // особые состояния и действия хранятся не в App.Properties, а в четвертом элементе KDSModeStates и в config-e !! if (_appNewSettings.ContainsKey("KDSModeSpecialStates")) { sBuf = _appNewSettings["KDSModeSpecialStates"]; KDSModeStates modeStates = KDSModeHelper.DefinedKDSModes[KDSModeEnum.Special]; modeStates.StringToAllowedStates(sBuf); modeStates.CreateUserStateSets(); } if (_appNewSettings.ContainsKey("KDSModeSpecialActions")) { sBuf = _appNewSettings["KDSModeSpecialActions"]; KDSModeHelper.DefinedKDSModes[KDSModeEnum.Special].StringToAllowedActions(sBuf); } MessageBox.Show("Настройки успешно сохранены в config-файле!", "Сохранение настроек в config-файле", MessageBoxButton.OK, MessageBoxImage.Information); } else { MessageBox.Show("Ошибка сохранения настроек приложения:" + Environment.NewLine + "\t" + errMsg, "Сохранение настроек в config-файле", MessageBoxButton.OK, MessageBoxImage.Error); } } this.DialogResult = true; }
private void ConfigEdit_Loaded(object sender, RoutedEventArgs e) { if (_deps != null) { // контрол меняет значение поля IsViewOnKDS в _deps !!! listBoxDepartments.ItemsSource = _deps.Values; } _cfgValKeeper.AddPreValue("depUIDs", false, null); _cfgValKeeper.AddPreValue("IsWriteTraceMessages", true, chkIsWriteTraceMessages); _cfgValKeeper.AddPreValue("IsLogUserAction", true, chkIsLogUserAction); _cfgValKeeper.AddPreValue("AppFontScale", false, tbFontSizeScale); _cfgValKeeper.AddPreValue("OrdersColumnsCount", true, tbxOrdersColumnsCount); _cfgValKeeper.AddPreValue("AutoReturnOrdersGroupByTime", false, tbTimerIntervalToOrderGroupByTime); _cfgValKeeper.AddPreValueDirectly("NewOrderAudioAttention", (string)cbxSelectAudio.SelectedValue); _cfgValKeeper.AddPreValue("OrderHeaderClickable", true, cbxOrderHeaderClickable); _cfgValKeeper.AddPreValue("IsIngredientsIndependent", true, cbxIngrClickable); _cfgValKeeper.AddPreValue("ShowTimerOnDependIngr", true, cbxIngrShowTimer); _cfgValKeeper.AddPreValue("IsShowOrderStatusByAllShownDishes", true, cbxShowOrderStatusByAllShownDishes); _cfgValKeeper.AddPreValue("IsMultipleStatusTabs", true, cbxMultipleStatusTabs); _cfgValKeeper.AddPreValue("IsDishGroupAndSumQuantity", true, cbxTabDishGroup); // получить от службы //AppDataProvider dataProvider = (AppDataProvider)AppLib.GetAppGlobalValue("AppDataProvider"); //int expTake = dataProvider.GetExpectedTakeValue(); //_cfgValKeeper.AddPreValueDirectly("ExpectedTake", expTake.ToString(), tbTimerExpectedTake); bool isDefault = true; KDSModeEnum eMode = KDSModeHelper.CurrentKDSMode; _cfgValKeeper.AddPreValueDirectly("KDSMode", eMode.ToString()); // прямое сохранение только в символьном виде if (KDSModeHelper.DefinedKDSModes.ContainsKey(eMode)) { string sStates, sActions; if (eMode == KDSModeEnum.Special) { KDSModeStates modeStates = KDSModeHelper.DefinedKDSModes[KDSModeEnum.Special]; sStates = modeStates.AllowedStatesToString(); sActions = modeStates.AllowedActionsToString(); } else { sStates = ""; sActions = ""; } _cfgValKeeper.AddPreValueDirectly("KDSModeSpecialStates", sStates); _cfgValKeeper.AddPreValueDirectly("KDSModeSpecialActions", sActions); isDefault = false; // чекнуть нужную кнопку foreach (RadioButton item in lbxKDSMode.Children.OfType <RadioButton>()) { if ((item.Tag != null) && (Convert.ToInt32(item.Tag) == (int)eMode)) { item.IsChecked = true; } else { item.IsChecked = false; } } } else { _cfgValKeeper.AddPreValueDirectly("KDSModeSpecialStates", ""); _cfgValKeeper.AddPreValueDirectly("KDSModeSpecialActions", ""); } // роль КДС по умолчанию if (isDefault) { _cfgValKeeper.AddPreValueDirectly("KDSMode", ""); _cfgValKeeper.AddPreValueDirectly("KDSModeSpecialStates", ""); _cfgValKeeper.AddPreValueDirectly("KDSModeSpecialActions", ""); rbSpecial.IsChecked = true; } }