C#WPF實戰出真汁09--【消費開單】--選擇菜品

1、功能介紹

當選擇一個空桌時,必須先開臺才能開單,可以先開臺,再開單,也可以開臺的同時開單

當選擇一個用餐中的餐桌時,必須顯示該桌前面已經點好的菜品,同時可以繼續點餐或結賬

所以無論哪個功能都涉及選擇菜品的操作,也就是選擇不同類型的商品

2、UI設計

這些數字0--9它們都是綁定同一個命令,但是命令處理時,會根據不同參數來區分是哪個按鈕被點擊了,所以就有CommandParameter="{Binding RelativeSource={RelativeSource Self}}",它表示綁定的參數是自己

3、視圖模型

完整代碼

using HQ.BLL;
using HQ.COMM;
using HQ.fResApp.BaseModel; 
using HQ.MODEL.DBModel;
using Panuon.UI.Silver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text; 
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows;
using HQ.fResApp.Utils;
using HQ.MODEL.UIModel;
using System.Windows.Input; 
using System.Globalization; 
using Panuon.UI.Silver.Core; namespace HQ.fResApp.ViewModel
{/// <summary>/// 消費開單視圖模型/// </summary>public class XiaoFeiKaiDanListVModel : ViewModelBase{public DiningTypeBLL diningbll = new DiningTypeBLL();//餐桌類型public DiningTableBLL tablebll = new DiningTableBLL();//餐臺列表 public DishTypeBLL dishbll = new DishTypeBLL();//菜品類型public PointMenuBLL menubll = new PointMenuBLL();//菜品列表public BillConsumeBLL billConsumebll = new BillConsumeBLL();//帳單消費列表public BillHistoryBLL billHistorybll = new BillHistoryBLL();//訂單歷史記錄public ListBox dishListBox { get; set; }//菜品列表ListBox控件對象public Dictionary<string, ListBox> DicdishListBox = new Dictionary<string, ListBox>();public PointMenuInfo selectDishItem = new PointMenuInfo();public double CostMoney = 0;public string globalGuid = "";//菜品類型public List<ListBoxItem> selectedItem = new List<ListBoxItem>();/// <summary>/// 用戶點擊選擇菜品時生成的訂單信息表/// </summary>List<PointMenuInfo> OrderInfoTable = new List<PointMenuInfo>();#region 屬性private ObservableCollection<TabItem> diningTypeList;/// <summary>/// 餐桌類型列表,頁面tabcontrol綁定的數據源/// </summary>public ObservableCollection<TabItem> DiningTypeList{get { return diningTypeList; }set{diningTypeList = value;OnPropertyChanged();}}private Visibility diningTypeTabPro = Visibility.Visible;/// <summary>/// 餐桌類型tabcontrol是否可見/// </summary>public Visibility DiningTypeTabPro{get { return diningTypeTabPro; }set{diningTypeTabPro = value;OnPropertyChanged();}}private Visibility diningTableListPro = Visibility.Visible;/// <summary>/// 餐桌列表是否可見/// </summary>public Visibility DiningTableListPro{get { return diningTableListPro; }set{diningTableListPro = value;OnPropertyChanged();}}private ObservableCollection<DiningTableDetail> diningTableList;/// <summary>///餐桌詳情列表/// </summary>public ObservableCollection<DiningTableDetail> DiningTableList{get { return diningTableList; }set{diningTableList = value;OnPropertyChanged();}}private ObservableCollection<PointMenuInfo> dishTableList;/// <summary>/// 菜品名稱列表,頁面listbox綁定的數據源/// </summary>public ObservableCollection<PointMenuInfo> DishTableList{get { return dishTableList; }set{dishTableList = value;OnPropertyChanged();}}private ObservableCollection<PointMenuInfo> addOrderInfoList = new ObservableCollection<PointMenuInfo>();/// <summary>/// 【繼續點餐】后新增的訂單或空桌開臺【開始點餐】后添加的訂單/// </summary>public ObservableCollection<PointMenuInfo> AddOrderInfoList{get { return addOrderInfoList; }set{addOrderInfoList = value;OnPropertyChanged();}}private ObservableCollection<TableConsumeInfo> tableConsumeList;/// <summary>/// 餐桌消費詳情列表/// </summary>public ObservableCollection<TableConsumeInfo> TableConsumeList{get { return tableConsumeList; }set{tableConsumeList = value;OnPropertyChanged();}}private PointMenuInfo dishNameItem = new PointMenuInfo();/// <summary>/// 所選的菜品名稱/// </summary>public PointMenuInfo DishNameItem{get { return dishNameItem; }set{dishNameItem = value;OnPropertyChanged();}}private DiningTableDetail diningTableItem = new DiningTableDetail();/// <summary>/// 餐桌詳情實體/// </summary>public DiningTableDetail DiningTableItem{get { return diningTableItem; }set{diningTableItem = value;OnPropertyChanged();}}private DiningType diningTypeItem = new DiningType();/// <summary>/// 餐桌類型/// </summary>public DiningType DiningTypeItem{get { return diningTypeItem; }set{diningTypeItem = value;OnPropertyChanged();}}private DishType dishTypeItem = new DishType();/// <summary>/// 菜品類型/// </summary>public DishType DishTypeItem{get { return dishTypeItem; }set{dishTypeItem = value;OnPropertyChanged();}}private Visibility tabConsumeHeadPro = Visibility.Collapsed;/// <summary>/// 已開單餐桌的【消費項目】表頭標題是否可見/// </summary>public Visibility TabConsumeHeadPro{get { return tabConsumeHeadPro; }set{tabConsumeHeadPro = value;OnPropertyChanged();}}private Visibility tabConsumeListPro = Visibility.Collapsed;/// <summary>/// 已開單餐桌的消費明細列表是否可見/// </summary>public Visibility TabConsumeListPro{get { return tabConsumeListPro; }set{tabConsumeListPro = value;OnPropertyChanged();}}private Visibility costSumInfoPro = Visibility.Collapsed;/// <summary>/// 消費項目匯總信息是否可見/// </summary>public Visibility CostSumInfoPro{get { return costSumInfoPro; }set{costSumInfoPro = value;OnPropertyChanged();}}private ObservableCollection<TabItem> dishTypeList;/// <summary>/// 菜品類型列表,頁面tabcontrol綁定的數據源/// </summary>public ObservableCollection<TabItem> DishTypeList{get { return dishTypeList; }set{dishTypeList = value;OnPropertyChanged();}}private Visibility goodsTypeTabPro = Visibility.Collapsed;/// <summary>/// 菜品類型選項卡是否可見/// </summary>public Visibility GoodsTypeTabPro{get { return goodsTypeTabPro; }set{goodsTypeTabPro = value;OnPropertyChanged();}}private Visibility goodsListBoxPro = Visibility.Collapsed;/// <summary>/// 菜品類型列表框是否可見/// </summary>public Visibility GoodsListBoxPro{get { return goodsListBoxPro; }set{goodsListBoxPro = value;OnPropertyChanged();}}private Visibility btnPaymentPro = Visibility.Collapsed;/// <summary>/// 【結帳】按鈕是否可見/// </summary>public Visibility BtnPaymentPro{get { return btnPaymentPro; }set{btnPaymentPro = value;OnPropertyChanged();}}private Visibility openOrderInfoPro = Visibility.Collapsed;/// <summary>/// 空桌準備開單的詳情是否可見/// </summary>public Visibility OpenOrderInfoPro{get { return openOrderInfoPro; }set{openOrderInfoPro = value;OnPropertyChanged();}}private Visibility openTableInfoPro = Visibility.Visible;/// <summary>/// 空桌需要開臺的詳情是否可見/// </summary>public Visibility OpenTableInfoPro{get { return openTableInfoPro; }set{openTableInfoPro = value;OnPropertyChanged();}}private string tableOrderNoPro = "xxxxxx";/// <summary>/// 餐桌訂單號/// </summary>public string TableOrderNoPro{get { return tableOrderNoPro; }set{tableOrderNoPro = value;OnPropertyChanged();}}private string tableNamePro = "xxx";/// <summary>/// 餐桌名稱/// </summary>public string TableNamePro{get { return tableNamePro; }set{tableNamePro = value;OnPropertyChanged();}}private string amountUser = "";/// <summary>/// 用餐人數/// </summary>public string AmountUser{get { return amountUser; }set{amountUser = value;OnPropertyChanged();}}private string amountTime = "";/// <summary>/// 用餐時間/// </summary>public string AmountTime{get { return amountTime; }set{amountTime = value;OnPropertyChanged();}}private string numOrderPro = "";/// <summary>/// 輸入就餐人數/// </summary>public string NumOrderPro{get { return numOrderPro; }set{numOrderPro = value;OnPropertyChanged();}}private string amountMoneyPro = "";/// <summary>/// 消費總金額/// </summary>public string AmountMoneyPro{get { return amountMoneyPro; }set{amountMoneyPro = value;OnPropertyChanged();}}private string amountCountPro = "";/// <summary>/// 消費總數量/// </summary>public string AmountCountPro{get { return amountCountPro; }set{amountCountPro = value;OnPropertyChanged();}}private string tableTypePro = "xxxx";/// <summary>/// 餐桌類型/// </summary>public string TableTypePro{get { return tableTypePro; }set{tableTypePro = value;OnPropertyChanged();}}private string txtTabControlTitle = "餐桌類型";/// <summary>/// tabcontrol標題/// </summary>public string TxtTabControlTitle{get { return txtTabControlTitle; }set{txtTabControlTitle = value;OnPropertyChanged();}}private string txtTabControlName = "餐桌面板";/// <summary>/// tabcontrol標題/// </summary>public string TxtTabControlName{get { return txtTabControlName; }set{txtTabControlName = value;OnPropertyChanged();}}private Visibility dishTypeTabPro = Visibility.Collapsed;/// <summary>/// 菜品類型tabcontrol是否可見/// </summary>public Visibility DishTypeTabPro{get { return dishTypeTabPro; }set{dishTypeTabPro = value;OnPropertyChanged();}}private Visibility dishTypeListPro = Visibility.Collapsed;/// <summary>/// 菜品列表ListBox是否可見/// </summary>public Visibility DishTypeListPro{get { return dishTypeListPro; }set{dishTypeListPro = value;OnPropertyChanged();}}private string txtCostMonePro = "";/// <summary>/// 點單金額/// </summary>public string TxtCostMonePro{get { return txtCostMonePro; }set{txtCostMonePro = value;OnPropertyChanged();}}private string txtCostCountPro = "";/// <summary>/// 點單數量/// </summary>public string TxtCostCountPro{get { return txtCostCountPro; }set{txtCostCountPro = value;OnPropertyChanged();}}private Visibility proNumBlockPro2 = Visibility.Collapsed;/// <summary>/// 選中菜品時的圖片是否可見/// </summary>public Visibility ProNumBlockPro2{get { return proNumBlockPro2; }set{proNumBlockPro2 = value;OnPropertyChanged();}}private Visibility checkOutPro = Visibility.Collapsed;/// <summary>/// 結賬或繼續點餐按鈕是否可見/// </summary>public Visibility CheckOutPro{get { return checkOutPro; }set{checkOutPro = value;OnPropertyChanged();}}private Visibility checkOutPro2 = Visibility.Collapsed;/// <summary>/// 消費時長及消費人數的stackpanel控件是否可見/// </summary>public Visibility CheckOutPro2{get { return checkOutPro2; }set{checkOutPro2 = value;OnPropertyChanged();}}private string dinersPro = "";/// <summary>/// 輸入就餐人數/// </summary>public string DinersPro{get { return dinersPro; }set{dinersPro = value;OnPropertyChanged();}}private string tableTxtRemarkPro = "";/// <summary>/// 立即開臺操作時的備注信息/// </summary>public string TableTxtRemarkPro{get { return tableTxtRemarkPro; }set{tableTxtRemarkPro = value;OnPropertyChanged();}}private bool chkIsOrderDetailPro = false;/// <summary>/// 開單后是否立即新增消費項目/// </summary>public bool ChkIsOrderDetailPro{get { return chkIsOrderDetailPro; }set{chkIsOrderDetailPro = value;OnPropertyChanged();}}private string startDinerPro = "繼續點餐";/// <summary>/// 開始點餐還是繼續點餐按鈕上的文字/// </summary>public string StartDinerPro{get { return startDinerPro; }set{startDinerPro = value;OnPropertyChanged();}}private Thickness tabConsumeHeadMarginPro = new Thickness(0, 0, 0, 0);/// <summary>/// 已經開單餐桌的消費列表中標題欄控件的margin設置/// </summary>public Thickness TabConsumeHeadMarginPro{get { return tabConsumeHeadMarginPro; }set{tabConsumeHeadMarginPro = value;OnPropertyChanged();}}private Thickness tableConsumeListMarginPro = new Thickness(0, 0, 0, 0);/// <summary>/// 已經開單餐桌的消費列表中listbox控件的margin設置/// </summary>public Thickness TableConsumeListMarginPro{get { return tableConsumeListMarginPro; }set{tableConsumeListMarginPro = value;OnPropertyChanged();}}private string tableConsumeListHeightPro = "auto";/// <summary>/// 已經開單餐桌的消費列表中listbox控件的高度設置/// </summary>public string TableConsumeListHeightPro{get { return tableConsumeListHeightPro; }set{tableConsumeListHeightPro = value;OnPropertyChanged();}}#endregionpublic XiaoFeiKaiDanListVModel(){DiningTypeList = getDiningTypeList();  //餐桌類型 DiningTableList = getDiningTableList(); //餐臺列表 }#region 方法/// <summary>/// 獲取菜品類型/// </summary>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>private ObservableCollection<TabItem> getDishTypeList(){ObservableCollection<TabItem> typeitemlist = new ObservableCollection<TabItem>();TabItem _ti = new TabItem(){Header = "所有菜品",Uid = "",Margin = new Thickness { Left = 0, Top = 0, Right = 10, Bottom = 0 },Padding = new Thickness { Left = 25, Right = 30, Top = 5, Bottom = 5 }};typeitemlist.Add(_ti);var parms = new ParmString { parm = "" };var _dishTypeRes = dishbll.QueryDishTypeList(parms).Result;if (_dishTypeRes.statusCode == (int)ApiEnum.Status){var prots = _dishTypeRes.data;if (prots != null){foreach (var _typeObj in prots){var bgc = new BrushConverter();TabItem ti = new TabItem(){Header = _typeObj.mtName,Uid = _typeObj.mtGuid.ToString(),Margin = new Thickness { Left = 0, Top = 0, Right = 10, Bottom = 0 },Padding = new Thickness { Left = 25, Right = 30, Top = 5, Bottom = 5 }};typeitemlist.Add(ti);}}}else{Logger.Default.ProcessError(_dishTypeRes.statusCode, "獲取菜單類型異常");}return typeitemlist;}/// <summary>/// 獲取菜品列表/// </summary>/// <param name="protype">菜品類型id</param>/// <returns></returns>private ObservableCollection<PointMenuInfo> getDishTableList(string protype){ObservableCollection<PointMenuInfo> TableDataList = new ObservableCollection<PointMenuInfo>();var _parms = new ParmString { parm = protype };var _res = menubll.QueryPointMenusBydtId(_parms).Result;if (_res.statusCode == (int)ApiEnum.Status){var _datas = _res.data;if (_datas != null){foreach (PointMenuInfo item in _datas){TableDataList.Add(item);}}}else{Notice.Show("沒有找到對應的菜品", "提示", 3, MessageBoxIcon.Info);Logger.Default.ProcessError(_res.statusCode, "根據商品類型獲取商品異常");}return TableDataList;}/// <summary>/// 獲取餐桌類型 /// </summary>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>public ObservableCollection<TabItem> getDiningTypeList(){ObservableCollection<TabItem> typeitemlist = new ObservableCollection<TabItem>();TabItem _ti = new TabItem(){Header = "所有餐臺",Margin = new Thickness { Left = 0, Top = 0, Right = 10, Bottom = 0 },Padding = new Thickness { Left = 25, Right = 30, Top = 5, Bottom = 5 }};typeitemlist.Add(_ti);var _parm = new ParmString { parm = "" };var _tabRest = diningbll.QueryDiningTypeList(_parm).Result;if (_tabRest.statusCode == (int)ApiEnum.Status){var _roomTypes = _tabRest.data;if (_roomTypes != null){foreach (var diningTypeObj in _roomTypes){var bgc = new BrushConverter();TabItem ti = new TabItem(){Header = diningTypeObj.rtName,Margin = new Thickness { Left = 0, Top = 0, Right = 10, Bottom = 0 },Padding = new Thickness { Left = 25, Right = 30, Top = 5, Bottom = 5 }};typeitemlist.Add(ti);}}}return typeitemlist;}/// <summary>/// 獲取餐桌列表/// </summary>/// <param name="strWhere">過濾條件</param>/// <param name="_rtId">餐桌類型</param>/// <returns></returns>public ObservableCollection<DiningTableDetail> getDiningTableList(string rtid = "", int rtstate = -1){ObservableCollection<DiningTableDetail> TableDataList = new ObservableCollection<DiningTableDetail>();var parms = new PageParm { diningtypeId = rtid, types = rtstate };var _tabRes = tablebll.QueryListByType(parms).Result;if (_tabRes.statusCode == (int)ApiEnum.Status){var tables = _tabRes.data;if (tables != null){foreach (var roomObj in tables){var _time = "0分鐘";if (roomObj.rtDate != null){_time = DateHelper.DateDiffMinutes(DateTime.Now, Convert.ToDateTime(roomObj.rtDate));}var _tbState = "#cccccc";var _tbStateName = "空閑";switch (roomObj.rtState){case "占用":_tbState = "#C800AAFF";_tbStateName = "用餐中";break;case "預定":_tbState = "green";_tbStateName = "預約中";_time = "0分鐘";break;case "臟臺":_tbState = "red";_tbStateName = "待清理";_time = "0分鐘";break;case "停用":_tbState = "black";_tbStateName = "已停用";_time = "0分鐘";break;}var _obj = new DiningTableDetail(){rtId = roomObj.rtId,rtName = roomObj.rtName,tbName = roomObj.rName,tbMaxNum = roomObj.rtNumber != null ? (int)roomObj.rtNumber : 0,userTime = _time,tbStateColor = _tbState,tbStateName = _tbStateName,tbId = roomObj.rbGuid,tbOrderNo = roomObj.obId};TableDataList.Add(_obj);}}}else{Notice.Show("系統連接失敗,請聯系您的管理員!", "提示", 3, MessageBoxIcon.Warning);Logger.Default.ProcessError(_tabRes.statusCode, "沒有獲取餐桌類型對應的所有餐臺");}return TableDataList;}/// <summary>/// 獲取單個餐桌的消費詳情/// </summary>/// <param name="strOrder">訂單號</param>private ObservableCollection<TableConsumeInfo> GetDeskConsumeDetail(string strOrder){ObservableCollection<TableConsumeInfo> consumeList = new ObservableCollection<TableConsumeInfo>();try{double _msMoney = 0;int amountCount = 0;double tMoney = 0;var parms = new ParmString { parm = strOrder };var _tabInfoRes = tablebll.GetTabCostdetails(parms).Result;if (_tabInfoRes.statusCode == (int)ApiEnum.Status){List<TableConsumeInfo> TableDetailList = _tabInfoRes.data;if (TableDetailList != null){BtnPaymentPro = Visibility.Visible;//結算按鈕可見foreach (var item in TableDetailList){tMoney = item.msPrice * item.msAmount;_msMoney = _msMoney + tMoney;amountCount = amountCount + item.msAmount;consumeList.Add(item);}StartDinerPro = "繼續點餐";}else{BtnPaymentPro = Visibility.Collapsed;//結算按鈕隱藏StartDinerPro = "開始點餐";}AmountMoneyPro = _msMoney.ToString();//消費總金額AmountCountPro = amountCount.ToString();//消費總數量}else{Logger.Default.ProcessError(_tabInfoRes.statusCode, "獲取單個餐桌消費詳情出現異常");}}catch (Exception ex){Notice.Show("查詢失敗!", "提示", 3, MessageBoxIcon.Warning);Logger.Default.Error("獲取單個餐桌消費詳情出現異常", ex);}return consumeList;}/// <summary>/// 結帳后刷新界面/// </summary>private void RefreshPage(){DiningTableList = getDiningTableList(); //餐臺列表更新 OrderInfoTable = new List<PointMenuInfo>();//清空帳單DinersPro = "";//就餐人數清空TableNamePro = "xxxx";//餐桌名稱TableTypePro = "xxxx";//餐桌類型TableOrderNoPro = "0000000000";//餐桌訂單號ChkIsOrderDetailPro = false;//開單后立即新增消費項目復選框OpenOrderInfoPro = Visibility.Collapsed;//空閑餐桌需要準備"開單"的詳情隱藏DishTypeListPro = Visibility.Collapsed;//菜品列表隱藏DishTypeTabPro = Visibility.Collapsed;//菜品類型隱藏TabConsumeHeadPro = Visibility.Collapsed;//已經開單餐桌的消費清單詳情,包括:標題欄,數據列,分隔線,匯總TabConsumeListPro = Visibility.Collapsed;CostSumInfoPro = Visibility.Collapsed;OpenTableInfoPro = Visibility.Visible;//空閑餐桌需要"開臺"的詳情顯示DiningTypeTabPro = Visibility.Visible;//餐桌類型顯示DiningTableListPro = Visibility.Visible;//餐桌列表顯示 }private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject{for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++){DependencyObject child = VisualTreeHelper.GetChild(obj, i);if (child != null && child is childItem){return (childItem)child;}else{childItem childOfChild = FindVisualChild<childItem>(child);if (childOfChild != null)return childOfChild;}}return null;}/// <summary>/// 利用VisualTreeHelper尋找指定依賴對象的父級對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static List<T> FindVisualParent<T>(DependencyObject obj) where T : DependencyObject{try{List<T> TList = new List<T> { };DependencyObject parent = VisualTreeHelper.GetParent(obj);if (parent != null && parent is T){TList.Add((T)parent);List<T> parentOfParent = FindVisualParent<T>(parent);if (parentOfParent != null){TList.AddRange(parentOfParent);}}else if (parent != null){List<T> parentOfParent = FindVisualParent<T>(parent);if (parentOfParent != null){TList.AddRange(parentOfParent);}}return TList;}catch (Exception ee){MessageBox.Show(ee.Message);return null;}}/// <summary>/// 搜索指定名稱的子元素/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <param name="name"></param>/// <returns></returns>public static T FindChild<T>(DependencyObject obj, string name) where T : FrameworkElement{for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++){DependencyObject child = VisualTreeHelper.GetChild(obj, i);if (child != null && child is T && (child as T).Name.Equals(name))return (T)child;else{T childOfChild = FindChild<T>(child, name);if (childOfChild != null)return childOfChild;}}return null;}/// <summary>/// 尋找某個控件的父級控件/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <param name="name"></param>/// <returns></returns>public T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement{DependencyObject parent = VisualTreeHelper.GetParent(obj);while (parent != null){if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name))){return (T)parent;}parent = VisualTreeHelper.GetParent(parent);}return null;}/// <summary>/// 尋找子控件/// </summary>/// <typeparam name="childItem"></typeparam>/// <param name="obj">父級控件</param>/// <param name="ctrtype">子控件類型名</param>/// <returns></returns>private object FindChildCtr<childItem>(DependencyObject obj, string ctrtype) where childItem : DependencyObject{var _childLen = VisualTreeHelper.GetChildrenCount(obj);for (int i = 0; i < _childLen; i++){DependencyObject child = VisualTreeHelper.GetChild(obj, i);if (child != null && child.DependencyObjectType.SystemType.Name == ctrtype){return child;}}return null;}#endregion#region 命令/// <summary>///  餐桌類型點擊切換命令(tabcontrol)/// </summary>public ICommand SelectDiningCommand{get{return new RelayCommand(o =>{if (o is TabControl){TabControl diningtab = o as TabControl;int index = diningtab.SelectedIndex;if (index == -1){diningtab.SelectedIndex = 0;}var tt = (o as TabControl).SelectedItem as TabItem;string strName = tt.Header.ToString();//獲取餐桌類型名稱//根據名稱獲取餐桌類型實體var _queryRes = diningbll.GetModel("  rtName='" + strName + "' ").Result;if (_queryRes.statusCode == (int)ApiEnum.Status){var diningTypeObj = _queryRes.data;var _diningTypeId = diningTypeObj != null ? diningTypeObj.rtGuid : string.Empty;var _rtstate = diningTypeObj != null && _diningTypeId != null ? 5 : -1;//根據餐桌類型獲取對應的餐臺列表DiningTableList = getDiningTableList(_diningTypeId, _rtstate);}}});}}/// <summary>/// 餐桌點擊命令(listbox)/// </summary>public ICommand SelectTableCommand{get{return new RelayCommand(o =>{if (o is ListBox){var obj = DiningTableItem;if (DiningTableItem != null){TableOrderNoPro = DiningTableItem.tbOrderNo;//餐臺訂單號TableNamePro = DiningTableItem.tbName;//餐臺名稱 AmountUser = DiningTableItem.tbMaxNum.ToString();//就餐人數AmountTime = DiningTableItem.userTime.Replace("分鐘", "");//用餐時間NumOrderPro = DiningTableItem.tbMaxNum.ToString();//輸入的就餐人數TableTypePro = DiningTableItem.rtName.ToString();//餐臺類型名稱switch (DiningTableItem.tbStateName){case "用餐中":TabConsumeHeadPro = Visibility.Visible;//消費項目TabConsumeListPro = Visibility.Visible;//消費明細CostSumInfoPro = Visibility.Visible;//消費匯總OpenTableInfoPro = Visibility.Collapsed;//開臺面板隱藏break;case "空閑":OpenTableInfoPro = Visibility.Visible;TabConsumeHeadPro = Visibility.Collapsed;TabConsumeListPro = Visibility.Collapsed;CostSumInfoPro = Visibility.Collapsed;TableOrderNoPro = "還沒有創建訂單";break;case "預約中":OpenTableInfoPro = Visibility.Visible;TabConsumeHeadPro = Visibility.Collapsed;TabConsumeListPro = Visibility.Collapsed;CostSumInfoPro = Visibility.Collapsed;TableOrderNoPro = "還沒有創建訂單";break;case "待清理":OpenTableInfoPro = Visibility.Visible;TabConsumeHeadPro = Visibility.Collapsed;TabConsumeListPro = Visibility.Collapsed;CostSumInfoPro = Visibility.Collapsed;break;case "已停用":Notice.Show("當前餐桌已停用,請選擇其他可用餐桌!", "提示", 3, MessageBoxIcon.Warning);break;}TableConsumeList = GetDeskConsumeDetail(TableOrderNoPro);//根據訂單號獲取單個餐臺的消費詳情 TableConsumeListMarginPro = new Thickness(0, 0, 0, 0);TabConsumeHeadMarginPro = new Thickness(0, 0, 0, 0);TableConsumeListHeightPro = "500";CheckOutPro = Visibility.Visible; }}});}}/// <summary>///  菜品類型點擊切換命令(tabcontrol)/// </summary>public ICommand SelectMenuCommand{get{return new RelayCommand(o =>{if (o is TabControl){TabControl control = o as TabControl;var _curTabItem = control.SelectedItem as TabItem;if (_curTabItem == null){control.SelectedIndex = 0;return;}var _mtguid = _curTabItem.Uid != null ? _curTabItem.Uid.ToString() : "";DishTableList = getDishTableList(_mtguid);globalGuid = _mtguid;if (dishListBox == null){return;}//此問題待解決//Dispatcher.CurrentDispatcher.Invoke(new Action(() =>//{//    ListBoxItem a1 = new ListBoxItem();//    var a2 = dishListBox.ItemContainerGenerator;//    for (int i = 0; i < dishListBox.Items.Count; i++)//    {//        if (a2.ContainerFromIndex(i) is ListBoxItem)//        {//            a1 = a2.ContainerFromIndex(i) as ListBoxItem;//            var c0 = selectedItem[0];//            ////尋找指定的控件,即ProNumBlock控件 //            ContentPresenter myContentPresenter = FindChildControlUtil.FindVisualChild<ContentPresenter>(a1);//            DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;//            StackPanel _proNumBlock = (StackPanel)myDataTemplate.FindName("ProNumBlock", myContentPresenter);//            if (_proNumBlock.IsVisible)//取消選中菜品//            {//                _proNumBlock.Visibility = Visibility.Collapsed;//設置控件隱藏  //            }//            else//選中當前菜品//            {//                _proNumBlock.Visibility = Visibility.Visible;//設置控件可見 //            }//        }//    }//}));//Application.Current.Dispatcher.BeginInvoke(new Action(() =>//{  //    //5、清空菜品面板中選擇的菜品//    ListBoxItem a1 = new ListBoxItem();//    var a2 = dishListBox.ItemContainerGenerator;//    for (int i = 0; i < dishListBox.Items.Count; i++)//    {//        if (a2.ContainerFromIndex(i) is ListBoxItem)//        {//            a1 = a2.ContainerFromIndex(i) as ListBoxItem;//            //尋找指定的控件,即ProNumBlock控件//            ContentPresenter myContentPresenter2 = FindChildControlUtil.FindVisualChild<ContentPresenter>(a1);//            if (myContentPresenter2 == null)//            {//                return;//            }//            string a1pmGuid = (a1.Content as PointMenuInfo).pmGuid;//            //遍歷新增的菜品訂單,判斷某個菜品的主鍵是否等于菜品列表中某個菜品的主鍵//            PointMenuInfo item = OrderInfoTable.Find(x => x.pmGuid.Equals(a1pmGuid));//            //如果相等,則尋找該listboxitem//            if (item != null)//            {//                break;//            }//        }//    }//    var c1 = selectedItem[0];//    PointMenuInfo c2=(PointMenuInfo)c1.Tag;//    c1.Content = c2;//    var c3 = c1.ContentTemplate;//    //尋找指定的控件,即ProNumBlock控件//    ContentPresenter myContentPresenter = FindChildControlUtil.FindVisualChild<ContentPresenter>(a1);//    if (myContentPresenter == null)//    {//        return;//    }//    DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;//    StackPanel _proNumBlock = (StackPanel)myDataTemplate.FindName("ProNumBlock", myContentPresenter);//    if (_proNumBlock.IsVisible)//取消選中菜品//    {//        _proNumBlock.Visibility = Visibility.Collapsed;//設置控件隱藏  //    }//    else//選中當前菜品//    {//        _proNumBlock.Visibility = Visibility.Visible;//設置控件可見 //    }//}));}});}}/// <summary>///  菜品名稱點擊命令(listbox)/// </summary>public ICommand SelectDishCommand{get{return new RelayCommand(o =>{if (o is ListBox){var mylistbox = (ListBox)o;var myindex = mylistbox.SelectedIndex;//獲取所選項的索引號 if (myindex == -1){return;}dishListBox = (ListBox)o;ListBoxItem a1 = new ListBoxItem();var myitem = DishNameItem;if (DishNameItem.msScalar == 0){Notice.Show("當前菜品庫存不足,請選擇其他菜品!", "提示", 3, MessageBoxIcon.Error);return;}var a2 = mylistbox.ItemContainerGenerator;//遍歷listbox所有的項集合for (int i = 0; i < mylistbox.Items.Count; i++){//如果當前項是一個listboxitemif (a2.ContainerFromIndex(i) is ListBoxItem){a1 = (ListBoxItem)a2.ContainerFromIndex(i);//并且該項的內容等于當前選擇菜品對象則中斷循環if (a1.Content.Equals(myitem)){a1.Tag = (PointMenuInfo)a1.Content;selectedItem.Add(a1);break;}}}//尋找指定的控件,即ProNumBlock控件ContentPresenter myContentPresenter = FindChildControlUtil.FindVisualChild<ContentPresenter>(a1);DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;StackPanel _proNumBlock = (StackPanel)myDataTemplate.FindName("ProNumBlock", myContentPresenter);AddOrderInfoList.Clear();if (_proNumBlock.IsVisible)//取消選中菜品{_proNumBlock.Visibility = Visibility.Collapsed;//設置控件隱藏 //遍歷所有訂單信息,如果某個訂單等于當前選擇菜品則從集合中移除 for (int i = OrderInfoTable.Count - 1; i >= 0; i--){var _proItem = (PointMenuInfo)OrderInfoTable[i];if (_proItem.pmGuid == DishNameItem.pmGuid){OrderInfoTable.Remove(OrderInfoTable[i]);//從集合中移除}}}else//選中當前菜品{_proNumBlock.Visibility = Visibility.Visible;//設置控件為可見PointMenuInfo buyProObj = new PointMenuInfo{pmGuid = DishNameItem.pmGuid,msName = DishNameItem.msName,msPrice = DishNameItem.msPrice,msScalar = DishNameItem.msScalar,buyNum = 1};OrderInfoTable.Add(buyProObj);//添加到集合中}ObservableCollection<PointMenuInfo> objOrderList = new ObservableCollection<PointMenuInfo>();//循環所有訂單并計算總費用和總數量 CostMoney = 0;int costCount = 0;foreach (PointMenuInfo itemPro in OrderInfoTable){CostMoney = CostMoney + itemPro.msPrice * itemPro.buyNum;costCount = costCount + itemPro.buyNum;objOrderList.Add(itemPro);}CultureInfo cn = new CultureInfo("zh-CN");TxtCostMonePro = CostMoney.ToString("c0", cn);AddOrderInfoList = objOrderList;TxtCostCountPro = costCount.ToString();//這里是為了處理SelectionChanged事件,因為SelectionChanged事件在同一個item中只會執行一次,當再次點擊時,必須改變listbox的索引號//所以這里必須人為的設置當前選中項為-1,即不選中任何一個listboxitem,當再次點擊同一個item時,SelectionChanged事件才會生效//SelectionChanged事件是指當選擇項發生更改時觸發的事件,當selectindex沒有變化時,該事件自然就不會發生,因此同一個選項兩次點擊時,只有第一次會發生//SelectionChanged事件,同一對象在第2次點擊時不會發生SelectionChanged事件,所以人為在這設置mylistbox.SelectedIndex = -1;mylistbox.SelectedIndex = -1;var my = selectedItem;}});}}/// <summary>///  【開始點餐】或【繼續點餐】命令 /// </summary>public ICommand TableContinueCostCommand{get{return new RelayCommand(o =>{DishTypeList = getDishTypeList();//菜品類型DishTableList = getDishTableList("");//菜品列表//修改面板文字TxtTabControlTitle = "菜品類型";TxtTabControlName = "菜品面板";//菜品控件可見DishTypeTabPro = Visibility.Visible;//菜品類型可見DishTypeListPro = Visibility.Visible;//菜品列表可見   //餐桌控件隱藏DiningTypeTabPro = Visibility.Collapsed;//餐桌類型隱藏DiningTableListPro = Visibility.Collapsed;//餐臺列表隱藏 TabConsumeHeadPro = Visibility.Visible;//已開桌消費項目標題欄可見TableConsumeList = GetDeskConsumeDetail(TableOrderNoPro);//獲取餐臺消費詳情 OpenOrderInfoPro = Visibility.Visible;//空桌準備開單或繼續點餐時新增菜品的表格可見 CostSumInfoPro = Visibility.Visible;//消費匯總CheckOutPro = Visibility.Collapsed;//結賬或繼續點餐按鈕隱藏CultureInfo cn = new CultureInfo("zh-CN");TxtCostMonePro = 0.ToString("c0", cn);TxtCostCountPro = "0";TableConsumeListMarginPro = new Thickness(0, -25, 0, 0);TabConsumeHeadMarginPro = new Thickness(0, -85, 0, 0);TableConsumeListHeightPro = "290";});}}/// <summary>///   數字按鍵點擊/// </summary>public ICommand DinerPersonNumberCommand{get{return new RelayCommand(o =>{if (o is Button){Button mybtn = o as Button;var curNumValue = mybtn.Content.ToString();if (curNumValue.Equals(".")){if (!string.IsNullOrEmpty(DinersPro)){if (DinersPro.IndexOf(".") < 0) DinersPro = DinersPro + curNumValue;}else{Notice.Show("當前取值不合法,請重新取值!", "提示", 3, MessageBoxIcon.Error);}}else{DinersPro = DinersPro + curNumValue;}NumOrderPro = DinersPro;}});}}/// <summary>///   數字按鍵刪除/// </summary>public ICommand DinerPersonDeleteCommand{get{return new RelayCommand(o =>{if (o is Button){Button mybtn = o as Button;int length = DinersPro.Length;if (length > 0){string ob = DinersPro.Remove(length - 1, 1);DinersPro = ob;}}});}}/// <summary>///   【立即開臺】命令 /// </summary>public ICommand TableStartOpenCommand{get{return new RelayCommand(o =>{if (string.IsNullOrEmpty(DinersPro)){Notice.Show("請輸入消費人數!", "提示", 3, MessageBoxIcon.Info);return;}var table = DiningTableItem;var _tableOrderNo = string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);DiningTable upTabObj = new DiningTable();upTabObj.rbGuid = table.tbId;upTabObj.rName = table.tbName;upTabObj.rtId = table.rtId;upTabObj.rtState = "占用";upTabObj.obId = _tableOrderNo;upTabObj.rtNumber = int.Parse(DinersPro);upTabObj.rtRemark = TableTxtRemarkPro; var _upRes = tablebll.UpStateById(upTabObj).Result;if (_upRes.statusCode == (int)ApiEnum.Status){TableOrderNoPro = _tableOrderNo;//開臺成功后,判斷是否勾選了“開單后立即新增消費項目”復選框var _isCheckedCostOrder = ChkIsOrderDetailPro;if (_isCheckedCostOrder){TableConsumeList = GetDeskConsumeDetail(TableOrderNoPro);//根據訂單號獲取單個餐臺的消費詳情 DiningTypeTabPro = Visibility.Collapsed; //餐桌類型隱藏 DiningTableListPro = Visibility.Collapsed;//餐臺列表隱藏 OpenTableInfoPro = Visibility.Collapsed;OpenOrderInfoPro = Visibility.Visible;//空桌準備開單或繼續點餐時新增菜品的表格可見 DishTypeTabPro = Visibility.Visible;//菜品類型可見DishTypeListPro = Visibility.Visible;//菜品列表可見  //修改面板文字TxtTabControlTitle = "菜品類型";TxtTabControlName = "菜品面板";CultureInfo cn = new CultureInfo("zh-CN");TxtCostMonePro = CostMoney.ToString("c0", cn);TxtCostCountPro = TableConsumeList.Count.ToString();DishTypeList = getDishTypeList();//菜品類型DishTableList = getDishTableList("");//菜品列表  }else{DiningTypeList = getDiningTypeList();  //餐桌類型 DiningTableList = getDiningTableList(); //餐臺列表 }Notice.Show("開臺成功!", "提示", 3, MessageBoxIcon.Success);}});}}/// <summary>///   【開單】命令/// </summary>public ICommand TableStartOrderCommand{get{return new RelayCommand(o =>{if (OrderInfoTable.Count == 0){Notice.Show("請選擇消費菜品!", "提示", 3, MessageBoxIcon.Warning);return;}//0、0獲取當前餐桌信息 var tt = TableNamePro;DiningTable _tabobj = tablebll.GetModelByCond(x => x.rName == TableNamePro).Result.data;if (_tabobj == null){Notice.Show("開單失敗!", "提示", 3, MessageBoxIcon.Warning);return;}//1、1生成帳單記錄List<BillConsume> billRecord = billConsumebll.CreateConsumeRecord(OrderInfoTable, TableOrderNoPro);//1、2添加帳單記錄var _isAddOrder = billConsumebll.AddBillList(billRecord).Result;if (_isAddOrder.statusCode != (int)ApiEnum.Status){Notice.Show("開單失敗!", "提示", 3, MessageBoxIcon.Warning);Logger.Default.ProcessError(_isAddOrder.statusCode, "保存消費項目詳情出現異常");return;}//2、1生成庫存記錄List<PointMenu> proPointMenuList = new List<PointMenu>();foreach (PointMenuInfo itemPro in OrderInfoTable){var curStock = itemPro.msScalar - itemPro.buyNum;//庫存量-購買量var _proObj = new PointMenuInfo{pmGuid = itemPro.pmGuid,msScalar = curStock >= 0 ? curStock : 0};proPointMenuList.Add(_proObj);}//2、2更新菜品的庫存量var _upStock = menubll.UpPointMenuStock(proPointMenuList).Result;if (_upStock.statusCode != (int)ApiEnum.Status){Logger.Default.ProcessError(_upStock.statusCode, "更新商品庫存出現異常");return;}//3、1生成訂單歷史記錄double amountCost = 0;//匯總消費總金額foreach (var itemCost in billRecord){amountCost += itemCost.msMoney * itemCost.msAmount;}//創建歷史訂單對象var _openOrder = new BillHistory{obGuid = Guid.NewGuid().ToString(),obId = TableOrderNoPro,tName = TableNamePro,obDate = DateTime.Now,obNumber = _tabobj.rtNumber,mId = "",//未涉及會員業務,暫置為空lastUpDate = DateTime.Now,opConsumeMoney = amountCost,opDiscountMoney = 0,opClientMoney = 0};//3、2保存消費訂單歷史var _openOrderRes = billHistorybll.AddbillHistory(_openOrder).Result;if (_openOrderRes.statusCode != (int)ApiEnum.Status){Notice.Show("保存消費訂單失敗!", "提示", 3, MessageBoxIcon.Error);Logger.Default.ProcessError(_openOrderRes.statusCode, "保存消費訂單出現異常");return;}//4、1 清空餐臺界面信息 TxtCostMonePro = "";//清空金額TxtCostCountPro = "";//清空數量 AddOrderInfoList.Clear();//清空新增的菜品列表 //清空點單金額和點單數量CultureInfo cn = new CultureInfo("zh-CN");TxtCostMonePro = 0.ToString("c0", cn);TxtCostCountPro = 0.ToString();//4、2更新餐臺數據信息及狀態 _tabobj.rtDate = DateTime.Now;//開單時間var _upres = tablebll.UpStateById(_tabobj).Result;if (_upres.statusCode != (int)ApiEnum.Status){Notice.Show("開單失敗!", "提示", 3, MessageBoxIcon.Error);Logger.Default.ProcessError(_openOrderRes.statusCode, "更新餐桌出現異常");return;}TabConsumeHeadPro = Visibility.Visible;//已開桌消費項目標題欄可見TabConsumeListPro = Visibility.Visible;//已開單餐臺消費列表可見//修改消費標題及Listbox列表的margin設置TableConsumeListMarginPro = new Thickness(0, -25, 0, 0);TabConsumeHeadMarginPro = new Thickness(0, -85, 0, 0);//修改消費標題及Listbox列表的高度設置TableConsumeListHeightPro = "290"; TableConsumeList = GetDeskConsumeDetail(TableOrderNoPro);//重新獲取餐臺消費詳情   CostSumInfoPro = Visibility.Visible;//消費匯總可見 CheckOutPro = Visibility.Collapsed;//結賬或繼續點餐按鈕隱藏CheckOutPro2 = Visibility.Collapsed;//消費時長及消費人數的stackpanel控件隱藏//5、清空菜品面板選中的菜品 ListBoxItem a1 = new ListBoxItem();var a2 = dishListBox.ItemContainerGenerator;for (int i = 0; i < dishListBox.Items.Count; i++){if (a2.ContainerFromIndex(i) is ListBoxItem){a1 = a2.ContainerFromIndex(i) as ListBoxItem;string a1pmGuid = (a1.Content as PointMenuInfo).pmGuid;//遍歷新增的菜品訂單,判斷某個菜品的主鍵是否等于菜品列表中某個菜品的主鍵PointMenuInfo item = OrderInfoTable.Find(x => x.pmGuid.Equals(a1pmGuid));//如果相等,則尋找該listboxitemif (item != null){//尋找指定的控件,即ProNumBlock控件ContentPresenter myContentPresenter = FindChildControlUtil.FindVisualChild<ContentPresenter>(a1);DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;StackPanel _proNumBlock = (StackPanel)myDataTemplate.FindName("ProNumBlock", myContentPresenter);if (_proNumBlock.IsVisible)//取消選中菜品{_proNumBlock.Visibility = Visibility.Collapsed;//設置控件隱藏  }else//選中當前菜品{_proNumBlock.Visibility = Visibility.Visible;//設置控件可見 }}}}OrderInfoTable.Clear();//清空已選菜品帳單Notice.Show("開單成功!", "提示", 3, MessageBoxIcon.Success);DishTableList = getDishTableList(globalGuid);//刷新菜品列表});}}/// <summary>///   【關閉】命令/// </summary>public ICommand TableCancelOrderCommand{get{return new RelayCommand(o =>{OpenOrderInfoPro = Visibility.Collapsed;//空閑餐桌需要準備"開單"的詳情隱藏TabConsumeHeadPro = Visibility.Collapsed;//已經開單餐桌的消費標題詳情隱藏TabConsumeListPro = Visibility.Collapsed;//已經開單餐桌的消費清單詳情隱藏CostSumInfoPro = Visibility.Collapsed;//已經開單餐桌的消費清單匯總隱藏DishTypeListPro = Visibility.Collapsed;//菜品列表隱藏DishTypeTabPro = Visibility.Collapsed;//菜品類型隱藏DiningTypeTabPro = Visibility.Visible;//餐桌類型可見DiningTableListPro = Visibility.Visible;//餐臺列表可見OpenTableInfoPro = Visibility.Visible;//空閑餐臺詳情可見DiningTypeList = getDiningTypeList();  //餐桌類型 DiningTableList = getDiningTableList(); //餐臺列表 TxtTabControlTitle = "餐桌類型";TxtTabControlName = "餐臺面板";DinersPro = "";//就餐人數TableTxtRemarkPro = "";//備注信息 ChkIsOrderDetailPro = false;//是否開單復選框CultureInfo cn = new CultureInfo("zh-CN");TxtCostMonePro = CostMoney.ToString("c0", cn);TxtCostCountPro = "";AddOrderInfoList.Clear();//清空開單信息OrderInfoTable.Clear();//清空開臺信息});}}/// <summary>///  菜品數量增加命令/// </summary>public ICommand BuyNumPlusCmd{get{return new RelayCommand(o =>{string menuguid = o.ToString();PointMenuInfo record = OrderInfoTable.First(x => x.pmGuid.Equals(menuguid));if (record.buyNum > 0){if (record.buyNum < record.msScalar)//購買數量必須小于庫存時才能增加{record.buyNum++;ObservableCollection<PointMenuInfo> objOrderList = new ObservableCollection<PointMenuInfo>();//循環所有訂單位計算總費用 CostMoney = 0;int costCount = 0;foreach (PointMenuInfo itemPro in OrderInfoTable){CostMoney = CostMoney + itemPro.msPrice * itemPro.buyNum;costCount = costCount + itemPro.buyNum;objOrderList.Add(itemPro);}CultureInfo cn = new CultureInfo("zh-CN");TxtCostMonePro = CostMoney.ToString("c0", cn);AddOrderInfoList = objOrderList;TxtCostCountPro = costCount.ToString();}else{var _msgRes = MessageBoxX.Show("對不起,消費數量不能超過庫存數量", "提示", Application.Current.MainWindow, MessageBoxButton.OK, new MessageBoxXConfigurations(){MessageBoxIcon = MessageBoxIcon.Warning,ButtonBrush = "#F1C825".ToColor().ToBrush(),});}}});}}/// <summary>///  菜品數量減少命令/// </summary>public ICommand BuyNumSubtractCmd{get{return new RelayCommand(o =>{string menuguid = o.ToString();PointMenuInfo record = OrderInfoTable.First(x => x.pmGuid.Equals(menuguid));if (record.buyNum > 1){record.buyNum--;ObservableCollection<PointMenuInfo> objOrderList = new ObservableCollection<PointMenuInfo>();//循環所有訂單位計算總費用 CostMoney = 0;int costCount = 0;foreach (PointMenuInfo itemPro in OrderInfoTable){CostMoney = CostMoney + itemPro.msPrice * itemPro.buyNum;costCount = costCount + itemPro.buyNum;objOrderList.Add(itemPro);}CultureInfo cn = new CultureInfo("zh-CN");TxtCostMonePro = CostMoney.ToString("c0", cn);AddOrderInfoList = objOrderList;TxtCostCountPro = costCount.ToString();}});}}/// <summary>///  結賬命令/// </summary>public ICommand SettlementCostCommand{get{return new RelayCommand(o =>{//1、獲取訂單數據 var res = billHistorybll.GetBillHistoryList(x => x.obId == TableOrderNoPro).Result;if (res.statusCode != (int)ApiEnum.Status){Notice.Show("操作失敗,請聯系您的管理員!", "提示", 3, MessageBoxIcon.Warning);return;}List<BillHistory> historyorderObj = res.data.OrderBy(x => x.opConsumeMoney).ToList();if (historyorderObj == null){Notice.Show("操作失敗,請聯系您的管理員!", "提示", 3, MessageBoxIcon.Warning);return;}////2、更新結賬金額foreach (BillHistory h in historyorderObj){h.opClientMoney = h.opConsumeMoney;h.lastUpDate = DateTime.Now;var upRes = billHistorybll.UpPayMoneyAttr(h).Result;if (upRes.statusCode != (int)ApiEnum.Status){Notice.Show("結賬失敗,請聯系您的管理員!", "提示", 3, MessageBoxIcon.Warning);Logger.Default.ProcessError(upRes.statusCode, "更新結賬金額出現異常,訂單號【" + TableOrderNoPro + "】");return;}}//3、更新餐桌狀態 var tabObjRes = tablebll.GetModelByCond(x => x.rName == TableNamePro).Result.data;tabObjRes.rtState = "空閑";tabObjRes.rtDate = null;tabObjRes.rtNumber = 0;tabObjRes.rtRemark = string.Empty;tabObjRes.obId = string.Empty;var upTabRes = tablebll.UpStateById(tabObjRes).Result;if (upTabRes.statusCode != (int)ApiEnum.Status){Notice.Show("結賬失敗,請聯系您的管理員!", "提示", 3, MessageBoxIcon.Warning);Logger.Default.ProcessError(upTabRes.statusCode, "更新餐桌狀態出現異常,餐桌號【" + TableNamePro + "】");}else{RefreshPage();//刷新界面Notice.Show("結賬成功!", "提示", 3, MessageBoxIcon.Success);}});}}#endregion}
}

4、運行測試

呈現所有菜品,點擊不同類型菜品,顯示該類型下的菜

原創不易,打字截圖不易,走過路過,不要錯過,歡迎點贊,收藏,轉載,復制,抄襲,留言,動動你的金手指,早日實現財務自由!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95698.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大廠語音合成成本深度對比:微軟 / 阿里 / 騰訊 / 火山 API 計費拆解與技術選型指南

在 AI 配音、智能客服、教育音頻等場景爆發的當下&#xff0c;語音合成 API 已成為企業技術棧中的核心組件。然而&#xff0c;不同云廠商的計費規則差異顯著&#xff0c;短文本 / 長文本計費分離、預付費 / 后付費價格梯度懸殊、音色授權費暗藏成本陷阱等問題&#xff0c;常導致…

Flutter開發 網絡請求

HttpClient&#xff08;dart自有&#xff09; 1.get 點擊請求按鈕獲取數據&#xff0c;解析數據獲取單詞展示到屏幕上。class MyState extends State {String info "暫無數據";List<Widget> texts [];overridevoid initState() {super.initState();}override…

vscode中用python調用matlab的函數(環境安裝)

本實踐適用于WIN11-x64和ubuntu22.04-x64系統&#xff0c;其余系統和架構未驗證。 效果展示 1.環境要求 MATLAB Engine API for Python 的系統要求&#xff1a;參閱此官方文檔MATLAB 與 Python 的版本兼容性&#xff1a;參閱此官方文檔 2.安裝步驟 安裝Vscode&#xff08;不…

【數據分享】大清河(大慶河)流域上游土地利用

而今天要說明數據就是大清河&#xff08;大慶河&#xff09;流域上游土地利用。數據介紹大清河&#xff0c;又稱大慶河&#xff0c;作為海河流域的重要支流&#xff0c;其流域上游地區不僅是區域水資源調控的關鍵節點&#xff0c;更是生態保護與經濟發展的重要載體。以下從地理…

圖論——Djikstra最短路

原理解釋 首先解釋一下它大概的應用場景以及原理&#xff1a;現在有這么一張圖&#xff0c;圖上各點之間都有一定的邊權或者說是距離。給定你一個起點&#xff08;例如點1&#xff09;&#xff0c;讓你求這個點到圖上所有點的最短距離是多少&#xff1f; 這個問題比較平常&…

kafka初步介紹

Kafka角色介紹TopicTopic主題的意思&#xff0c;消費者必須指定主題用于的消息發送&#xff0c;生產者也必須指定主題用于消息的接收。topic只是邏輯上的劃分。partitionpartition是分區的意思&#xff0c;他的主要作用是將發送到一個topic的數據做一個劃分。如果有4個partitio…

windows10的vs2019編譯openssl靜態庫備忘

1、下載安裝openssl源碼2、官網下載安裝activeperl或Strawberry Perl。官網下載慢&#xff0c;網盤找找。使用中activeperl有些異常提示、缺模塊&#xff0c;最后使用了Strawberry Perl。3、安裝nasm。powershell使用choco install nasm -y 即可。powershell使用cd命令打開當前…

學習筆記與效率提升指南:編程、記憶與面試備考

在學習與工作中&#xff0c;高效的記錄習慣、針對性的記憶方法和實用的技能儲備&#xff0c;是提升效率的關鍵。本文結合編程學習、面試備考和英語單詞積累&#xff0c;整理一套可落地的學習思路&#xff0c;尤其適合編程初學者。 一、學習核心原則&#xff1a;高效優先&#x…

順豐面試題

1. 你擅長處理哪類問題推薦回答&#xff1a; "我比較擅長處理以下幾類前端問題&#xff1a;性能優化&#xff1a;包括加載優化&#xff08;代碼分割、懶加載&#xff09;、運行時優化&#xff08;減少重排重繪&#xff09;等復雜組件開發&#xff1a;如表單聯動、可視化圖…

Warmup_steps 設置經驗

文章目錄什么是 Warmup&#xff1f;實現示例科學設置 Warmup 的黃金法則直觀例子什么是 Warmup&#xff1f; Warmup 是一種學習率調度策略&#xff0c;在訓練初期逐步增加學習率&#xff08;LR&#xff09;&#xff0c;而不是直接使用目標學習率。它解決了兩個關鍵問題&#x…

vue一個超簡單的菜單欄伸縮示例

代碼<template><div class"container"><!-- 左側區域 --><div class"left-side" :style"{ width: leftWidth px }">左側內容</div><!-- 右側區域 --><div class"right-side" :style"{ l…

Spark學習(Pyspark)

&#xff08;1&#xff09;Spark基礎入門 ①什么是Spark Spark是一款分布式內存計算的統一分析引擎。其特點就是對任意類型的數據進行自定義計算。Spark可以計算&#xff1a;結構化、半結構化、非結構化等各種類型的數據結構&#xff0c;同時也支持使用Python、Java、Scala、R以…

PDF壓縮原理詳解:如何在不失真的前提下減小文件體積?

與直接刪除內容不同&#xff0c;良好的PDF壓縮能在大幅減小體積的同時&#xff0c;較好地保留原有文字清晰度和圖像質量&#xff0c;兼顧實用性與視覺效果。軟件操作十分直觀&#xff0c;僅需設置輸入文件與輸出路徑&#xff0c;點擊【開始壓縮】按鈕即可啟動處理。畫質壓縮等級…

從應用場景看國產化FPGA潛力,紫光同創研討會武漢·北京站回顧

八月&#xff0c;紫光同創 FPGA 技術研討會先后在武漢、北京舉行。作為紫光同創官方合作伙伴&#xff0c;ALINX 攜紫光同創 FPGA 開發板及行業解決方案亮相&#xff0c;與來自通信、工業控制、醫療、圖像視頻、消費電子等領域的近 200 位行業專家齊聚一堂&#xff0c;通過主題演…

安卓APK包體優化全攻略

目錄 正常默認打包流程&#xff08;以Android平臺為例&#xff09; 查看編輯器打包日志 壓縮圖片 壓縮網格模型 壓縮貼圖 壓縮音頻文件 只打64位包 最終大小 正常默認打包流程&#xff08;以Android平臺為例&#xff09; 準備工作&#xff1a; 確保已安裝最新版Unity H…

嵌入式學習日記(28)進程、線程

回收資源空間子進程回收策略1、wait阻塞回收&#xff1a;一般情況下父進程專門負責回收2、waitpid非阻塞回收&#xff1a;搭配輪詢方式回收3、不回收&#xff1a;子進程任務一致執行4、異步回收&#xff1a;子進程結束后通知父進程進行回收exec 函數族三種調用外部程序的方式#i…

測試用例的一些事項

為什么要寫測試用例&#xff1f;寫測試用例的原因是為了避免遺漏測試&#xff0c;我們要根據給的文檔將邏輯都表達出來&#xff0c;不能因為簡單而不寫&#xff0c;日后版本更新就知道自己哪些測了哪些沒測。在沒有文檔的時候測試用例該怎么寫&#xff1f;大家可以考慮安全測試…

當Java遇見AI:飛算驅動的個人博客介紹智能生成風暴

一、飛算JavaAI&#xff1a;重新定義個人開發的"智能魔法棒" 1.1 開發者需求變革&#xff1a;從"技術門檻"到"創意優先"的時代 在數字化浪潮席卷全球的今天&#xff0c;個人品牌建設已成為技術從業者、創業者乃至學生的剛需——無論是程序員分享…

小程序排名優化:用戶行為數據背后的提升密碼

用戶在小程序中的每一次點擊、每一次停留、每一次分享&#xff0c;都在產生著有價值的數據。這些看似零散的用戶行為數據&#xff0c;其實隱藏著提升小程序排名的密碼。平臺在判定小程序排名時&#xff0c;用戶行為數據是重要的參考依據&#xff0c;因為它直接反映了小程序對用…

【DSP28335 入門教程】深度解析中斷系統:三級架構與響應機制

大家好&#xff0c;歡迎來到我們的 DSP28335 深度解析系列。在之前的實戰中&#xff0c;我們通過 while(1) 循環和延時函數實現了各種控制&#xff0c;這種方式被稱為輪詢。但輪詢就像一個焦急的門衛&#xff0c;需要不停地去檢查每個門口是否有人&#xff0c;既浪費精力又效率…