You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

452 lines
14 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<DesktopReportEntity> list = null;
public DesktopReport()
{
InitializeComponent();
this.controlBox1.Text = "桌台订单汇总查询";
this.controlBox1.ShowApplicationVersion = false;
list = new List<DesktopReportEntity>();
}
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, "打开屏幕键盘异常");
}
}
/// <summary>
/// 营业模式变化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<DesktopReportEntity> 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<DesktopReportEntity> 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<DesktopReportEntity>(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<string, List<DesktopReportEntity>>();
foreach (var item in this.list)
{
var tableName = item.TableName;
if (!map.ContainsKey(tableName))
{
map.Add(tableName, new List<DesktopReportEntity>());
}
map[tableName].Add(item);
}
int lastIndex = map.Keys.Count;
foreach (var obj in map)
{
lastIndex--;
//构建收银小票模版参数
var vars = this.BuilderPayVariable(obj.Key,obj.Value);
Tuple<bool, string> 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<string, List<DesktopReportEntity>>();
foreach (var item in this.list)
{
var tableName = item.TableName;
if (!map.ContainsKey(tableName))
{
map.Add(tableName, new List<DesktopReportEntity>());
}
map[tableName].Add(item);
}
var newList = new List<DesktopReportEntity>();
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<bool, string> result = ReportHelper.PrinterTicket("桌台汇总", vars, true, false, 0, allowCutPager ? 0 : 3);
}
public List<Printer.VariableValue> BuilderPayVariable(List<DesktopReportEntity> lists)
{
var vars = new List<Printer.VariableValue>();
var v = new Printer.VariableValue();
v.Key = "汇总列表";
v.DataType = DataType.List;
//餐桌名称只打印第一行
var map = new Dictionary<string,string>();
decimal sum = 0;
var list = new List<Dictionary<string, string>>();
foreach (var item in lists)
{
sum += item.TotalQuantity;
var row = new Dictionary<string, string>();
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<string, string>();
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<Printer.VariableValue> BuilderPayVariable(string tableName,List<DesktopReportEntity> lists)
{
var vars = new List<Printer.VariableValue>();
var v = new Printer.VariableValue();
v.Key = "汇总列表";
v.DataType = DataType.List;
decimal sum = 0;
var list = new List<Dictionary<string, string>>();
foreach (var item in lists)
{
sum += item.TotalQuantity;
var row = new Dictionary<string, string>();
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<string, string>();
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();
}
/// <summary>
/// 查询按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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
{
/// <summary>
/// 餐桌号
/// </summary>
[JsonProperty(PropertyName = "tableNo")]
public string TableNo { get; set; } = string.Empty;
/// <summary>
/// 餐桌号
/// </summary>
[JsonProperty(PropertyName = "tableName")]
public string TableName { get; set; } = string.Empty;
/// <summary>
/// 菜品名称
/// </summary>
[JsonProperty(PropertyName = "displayName")]
public string DisplayName { get; set; } = string.Empty;
/// <summary>
/// 菜品数量
/// </summary>
[JsonProperty(PropertyName = "totalQuantity")]
public int TotalQuantity { get; set; }
}
}