using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; using DevComponents.DotNetBar; using DevComponents.DotNetBar.Controls; using Newtonsoft.Json; using POSV.Component; using POSV.Entity.ReportPrint; using POSV.Helper; using POSV.Printer; using POSV.ShoppingCart; using POSV.Utils; namespace POSV.Report { public partial class DesktopReport : BusinessForm { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public int orderType = -1; private List list = null; public DesktopReport() { InitializeComponent(); this.controlBox1.Text = "桌台订单汇总查询"; this.controlBox1.ShowApplicationVersion = false; list = new List(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; DefaultGridStyle.setDefaultGridStyle(this.desktopTable); //半角输入 this.ImeMode = ImeMode.OnHalf; this.startPicker.Value = DateTime.Parse(Global.Instance.BusinessPlan.StartTimeSimple); this.endPicker.Value = DateTime.Parse(Global.Instance.BusinessPlan.EndTimeSimple); this.checkBoxX1.Checked = true; //第一步获取订单列表 QueryTicket(); } private void OnQueryTableNameClick(object sender, EventArgs e) { DeskNoSelect deskNoSelect = new DeskNoSelect(); deskNoSelect.OnSelected -= OnTableSelected; deskNoSelect.OnSelected += OnTableSelected; deskNoSelect.ShowDialog(); } private void OnTableSelected(Entity.Table table) { if(table != null) { this.txtTableName.Text = table.Name; } } private void OnControlBoxKeyboardClick(object sender, EventArgs e) { try { KeyboardType keyboardType = KeyboardType.英文; Type type = this.ActiveControl.GetType(); PropertyInfo pinfo = type.GetProperty("Keyboard"); if (pinfo != null) { keyboardType = (KeyboardType)pinfo.GetValue(this.ActiveControl, null); } var keyboard = Application.OpenForms["VirtualKeyboard"]; if (keyboard == null) { keyboard = new VirtualKeyboard(keyboardType); } ((VirtualKeyboard)keyboard).ShowVirtualKeyboard(this, keyboardType); } catch (Exception ex) { LOGGER.Error(ex, "打开屏幕键盘异常"); } } /// /// 营业模式变化 /// /// /// private void cb_change_click(object sender, EventArgs e) { var obj = sender as CheckBoxX; var indexT = obj.Tag as string; if ("全部".Equals(indexT)) { orderType = -1; } if ("堂食".Equals(indexT)) { orderType = 0; } if ("外带".Equals(indexT)) { orderType = 1; } if ("电话外卖".Equals(indexT)) { orderType = 2; } if ("餐桌".Equals(indexT)) { orderType = 3; } if ("美团外卖".Equals(indexT)) { orderType = 4; } if ("饿了么".Equals(indexT)) { orderType = 5; } if ("百度外卖".Equals(indexT)) { orderType = 6; } if ("微信点餐".Equals(indexT)) { orderType = 7; } //QueryTicket(); } public void QueryTicket() { //获取选择的订单 List detail = getBusTicketList(this.startPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"), this.endPicker.Value.ToString("yyyy-MM-dd HH:mm:ss")); desktopTable.PrimaryGrid.DataSource = detail; } public List getBusTicketList(string startTime, string endTime) { list.Clear(); try { using (var db = Global.Instance.OpenDataBase) { StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append("select o.tableName ,o.orderType, i.displayName,sum(quantity) as totalQuantity from (select * from pos_order_item where finishDate>= '{0}' and finishDate<= '{1}') i left join pos_order o on o.id = i.orderId "); sqlBuld.Append(" where o.orderStatus in(2, 4) "); if (orderType >= 0) { sqlBuld.Append(" and orderType = " + orderType + " "); } var tableName = this.txtTableName.Text.Trim(); if (!string.IsNullOrEmpty(tableName)) { sqlBuld.Append(" and tableName like '%" + tableName + "%' "); } var dishName = this.txtDishName.Text.Trim(); if (!string.IsNullOrEmpty(dishName)) { sqlBuld.Append(" and displayName like '%" + dishName + "%' "); } sqlBuld.Append(" group by tableName,displayName "); string sql = string.Format(sqlBuld.ToString(), startTime, endTime); this.list = db.Query(sql).ToList(); } } catch (Exception ex) { LOGGER.Error(ex); } return list; } private void btn_print_Click(object sender, EventArgs e) { this.ShowToastNotify(this, "开始打印"); //每桌对应菜品归类 var map = new Dictionary>(); foreach (var item in this.list) { var tableName = item.TableName; if (!map.ContainsKey(tableName)) { map.Add(tableName, new List()); } map[tableName].Add(item); } int lastIndex = map.Keys.Count; foreach (var obj in map) { lastIndex--; //构建收银小票模版参数 var vars = this.BuilderPayVariable(obj.Key,obj.Value); Tuple result = null; result = ReportHelper.PrinterTicket("桌台单打", vars, true, false, 0, lastIndex > 0 ? 0 : 3); //延迟200毫秒 Thread.Sleep(200); } } private void btn_print_all_Click(object sender, EventArgs e) { this.ShowToastNotify(this, "开始打印"); //每桌对应菜品归类 var map = new Dictionary>(); foreach (var item in this.list) { var tableName = item.TableName; if (!map.ContainsKey(tableName)) { map.Add(tableName, new List()); } map[tableName].Add(item); } var newList = new List(); foreach (var obj in map) { newList.AddRange(obj.Value); } //构建收银小票模版参数 var vars = this.BuilderPayVariable(newList); //如果不允许切纸,自动走纸3行 var allowCutPager = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_CASHIER_ALLOW_CUT_PAGER); Tuple result = ReportHelper.PrinterTicket("桌台汇总", vars, true, false, 0, allowCutPager ? 0 : 3); } public List BuilderPayVariable(List lists) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "汇总列表"; v.DataType = DataType.List; //餐桌名称只打印第一行 var map = new Dictionary(); decimal sum = 0; var list = new List>(); foreach (var item in lists) { sum += item.TotalQuantity; var row = new Dictionary(); row.Add("@餐桌@", map.ContainsKey(item.TableName) ? "" : item.TableName); row.Add("@菜品@", item.DisplayName); row.Add("@数量@", string.Format("{0}", item.TotalQuantity)); list.Add(row); if (!map.ContainsKey(item.TableName)) { map.Add(item.TableName, item.TableNo); } } v.Value = JsonUtils.Serialize(list); vars.Add(v); v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@门店名称@", Global.Instance.Worker.StoreInfo.PrintName); data.Add("@门店编码@", Global.Instance.Worker.StoreInfo.No); data.Add("@收银员编码@", Global.Instance.Worker.No); data.Add("@收银员名称@", Global.Instance.Worker.Name); data.Add("@打印时间@", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); data.Add("@开始时间@", this.startPicker.Value.ToString("yyyy-MM-dd HH:mm:ss")); data.Add("@结束时间@", this.endPicker.Value.ToString("yyyy-MM-dd HH:mm:ss")); data.Add("@总数量@", string.Format("{0}", sum)); v.Value = JsonUtils.Serialize(data); vars.Add(v); return vars; } public List BuilderPayVariable(string tableName,List lists) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "汇总列表"; v.DataType = DataType.List; decimal sum = 0; var list = new List>(); foreach (var item in lists) { sum += item.TotalQuantity; var row = new Dictionary(); row.Add("@餐桌@", item.TableName); row.Add("@菜品@", item.DisplayName); row.Add("@数量@", string.Format("{0}", item.TotalQuantity)); list.Add(row); } v.Value = JsonUtils.Serialize(list); vars.Add(v); v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@门店名称@", Global.Instance.Worker.StoreInfo.PrintName); data.Add("@门店编码@", Global.Instance.Worker.StoreInfo.No); data.Add("@收银员编码@", Global.Instance.Worker.No); data.Add("@收银员名称@", Global.Instance.Worker.Name); data.Add("@打印时间@", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); data.Add("@开始时间@", this.startPicker.Value.ToString("yyyy-MM-dd HH:mm:ss")); data.Add("@结束时间@", this.endPicker.Value.ToString("yyyy-MM-dd HH:mm:ss")); data.Add("@总数量@", string.Format("{0}", sum)); data.Add("@桌台名称@", tableName); v.Value = JsonUtils.Serialize(data); vars.Add(v); return vars; } private void btn_time_Click(object sender, EventArgs e) { var obj = sender as ButtonX; var typeStr = obj.Tag as string; var type = (ReportQuickDate)Enum.Parse(typeof(ReportQuickDate), typeStr); var res = DateTimeUtils.CalculateBusinessPlanDate(type, this.startPicker.Value, this.endPicker.Value); this.startPicker.Value = res.Item1; this.endPicker.Value = res.Item2; QueryTicket(); } /// /// 查询按钮 /// /// /// private void btn_query_Click(object sender, EventArgs e) { QueryTicket(); } private void btn_exit_Click(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void OnControlBoxCloseClick(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void OnCloseTouchClick(object sender, EventArgs e) { //先关闭父窗体 if (this.Owner != null) { this.Owner.Close(); } //再关闭当前窗体 this.Close(); } } [Serializable] public class DesktopReportEntity { /// /// 餐桌号 /// [JsonProperty(PropertyName = "tableNo")] public string TableNo { get; set; } = string.Empty; /// /// 餐桌号 /// [JsonProperty(PropertyName = "tableName")] public string TableName { get; set; } = string.Empty; /// /// 菜品名称 /// [JsonProperty(PropertyName = "displayName")] public string DisplayName { get; set; } = string.Empty; /// /// 菜品数量 /// [JsonProperty(PropertyName = "totalQuantity")] public int TotalQuantity { get; set; } } }