using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using POSV.Bean; using POSV.Printer; using POSV.ShoppingCart; using POSV.Utils; using POSV.Entity.ReportPrint; using POSV.Card; using POSV.OtherWaiMai; using System.Threading; using NLog; using System.Text.RegularExpressions; using POSV.QiMai; namespace POSV.Helper { public class WaiMaiHelper { private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// 获取系统配置的收银小票打印机 /// /// public static PrinterObject GetTicketPrinterObject(string name, bool cutPager, bool openCashbox) { var pobject = new PrinterObject(); string json = string.Empty; if (name == "外卖打印机") { //单独使用外卖小票打印机 json = Global.Instance.GlobalConfigStringValue(ConfigConstant.PERIPHERAL_WM_TICKET_PRINTER); } else { json = Global.Instance.GlobalConfigStringValue(ConfigConstant.PERIPHERAL_CASHIER_TICKET); } if (string.IsNullOrEmpty(json)) { json = JsonUtils.Serialize(ConfigConstant.PeripheralGroupDefaultValue()); } var printer = JsonUtils.Deserialize(json); pobject.Id = printer.Id; pobject.Name = printer.Name; pobject.PortType = (PortType)Enum.Parse(typeof(PortType), printer.Port); pobject.DynamicLibrary = (DynamicLibrary)Enum.Parse(typeof(DynamicLibrary), printer.DynamicLibrary); pobject.PageWidth = printer.PageWidth; pobject.CutPager = cutPager; pobject.OpenCashbox = openCashbox; pobject.Data[PrinterObject.COM_PORT_NAME] = printer.Data[Constant.COM_PORT_NAME]; pobject.Data[PrinterObject.COM_PORT_BAUD] = printer.Data[Constant.COM_PORT_BAUD]; pobject.Data[PrinterObject.LPT_NAME] = printer.Data[Constant.LPT_NAME]; pobject.Data[PrinterObject.DRIVE_NAME] = printer.Data[Constant.DRIVE_NAME]; pobject.Data[PrinterObject.NET_IP_ADDRESS] = printer.Data[Constant.NET_IP_ADDRESS]; pobject.Data[PrinterObject.USB_PID] = printer.Data[Constant.USB_PID]; pobject.Data[PrinterObject.USB_VID] = printer.Data[Constant.USB_VID]; pobject.EscPosCommand.InitCommand = printer.InitCommand; pobject.EscPosCommand.NormalCommand = printer.NormalCommand; pobject.EscPosCommand.DoubleHeightCommand = printer.DoubleHeightCommand; pobject.EscPosCommand.DoubleWidthCommand = printer.DoubleWidthCommand; pobject.EscPosCommand.DoubleWidthHeightCommand = printer.DoubleWidthHeightCommand; pobject.EscPosCommand.CutPageCommand = printer.CutPageCommand; pobject.EscPosCommand.CashboxCommand = printer.CashboxCommand; pobject.EscPosCommand.AlignCenterCommand = printer.AlignCenterCommand; pobject.EscPosCommand.AlignLeftCommand = printer.AlignLeftCommand; pobject.EscPosCommand.AlignRightCommand = printer.AlignRightCommand; return pobject; } /// /// 构建美团外卖订单打印 /// /// /// public static List BuilderMeiTuanVariable(string meituanShop, MeiTuanOrderResponse response, bool isRprint) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@营业模式@", OrderType.美团外卖.ToString()); data.Add("@退单标识@", "false"); data.Add("@外卖门店@", meituanShop); data.Add("@外卖单号@", response.OrderIdView); if (response.PayType == 1) { data.Add("@支付方式@", "货到付款"); } else if (response.PayType == 2) { data.Add("@支付方式@", "在线支付"); } else { data.Add("@支付方式@", "其他支付方式"); } if (response.PickType == 0) { data.Add("@是否到店自取@", "false"); } else { data.Add("@是否到店自取@", "true"); } if (response.DeliveryTime.Equals("0")) { data.Add("@是否预定@", "false"); data.Add("@送达时间@", "立即送达"); } else { data.Add("@是否预定@", "true"); data.Add("@送达时间@", response.DeliveryTime); } data.Add("@就餐人数@", response.DinnersNumber); data.Add("@订单备注@", response.Caution); if (isRprint) { data.Add("@是否补打@", "(补打单)"); data.Add("@重打标识@", "true"); } else { data.Add("@是否补打@", ""); data.Add("@重打标识@", "false"); } data.Add("@下单时间@", response.CTime); data.Add("@当日序号@", string.Format("{0}", response.DaySeq)); data.Add("@订餐人@", response.RecipientName); data.Add("@订餐电话@", response.RecipientPhone); if (!string.IsNullOrEmpty(response.RecipientAddress)) { string[] addressArray = Regex.Split(response.RecipientAddress, "@#", RegexOptions.IgnoreCase); data.Add("@送餐地址@", addressArray[0]); } else { data.Add("@送餐地址@", ""); } data.Add("@配送费用@", string.Format("{0}", response.ShippingFee)); data.Add("@订单原价@", string.Format("{0}", response.OriginalPrice)); data.Add("@订单总额@", string.Format("{0}", response.Total)); if (response.HasInvoiced == 0) { data.Add("@是否发票@", string.Format("{0}", "false")); } else { data.Add("@是否发票@", string.Format("{0}", "true")); } data.Add("@发票信息@", string.Format("{0}", response.InvoiceTitle)); int countExtras = 0; foreach (var item in response.Extras) { if (!string.IsNullOrEmpty(item.Remark)) { countExtras = countExtras + 1; } } if (countExtras > 0) { data.Add("@是否打印优惠明细@", "true"); } else { data.Add("@是否打印优惠明细@", "false"); } decimal packageFee = 0.00M; //口袋列表 List listDetail = response.Detail.OrderBy(x => x.Cart_id).ToList(); foreach (var item in listDetail) { packageFee = packageFee + item.Box_num * item.Box_price; } data.Add("@餐盒费@", string.Format("{0}", packageFee)); v.Value = JsonUtils.Serialize(data); vars.Add(v); v = new Printer.VariableValue(); v.Key = "点餐列表"; v.DataType = DataType.List; var list = new List>(); //口袋列表 //List listDetail = response.Detail.OrderBy(x => x.Cart_id).ToList(); int i = -1; foreach (var item in listDetail) { var row = new Dictionary(); if (i != item.Cart_id) { row = new Dictionary(); row.Add("@名称@", "----" + (item.Cart_id + 1) + "号口袋----"); row.Add("@数量@", ""); row.Add("@金额@", ""); list.Add(row); i = item.Cart_id; } Tuple nameAdd = Global.Instance.Additional; row = new Dictionary(); row.Add("@名称@", item.Food_name + (string.IsNullOrEmpty(item.Spec) ? "" : nameAdd.Item1 + item.Spec + nameAdd.Item2) + (string.IsNullOrEmpty(item.Food_property) ? "" : nameAdd.Item1 + item.Food_property + nameAdd.Item2)); row.Add("@数量@", string.Format("{0}", item.Quantity)); row.Add("@金额@", string.Format("{0}", StringUtils.GetDecimal(item.Quantity) * item.Price)); list.Add(row); packageFee = packageFee + item.Box_num * item.Box_price; } var row1 = new Dictionary(); row1.Add("@名称@", "-------------"); row1.Add("@数量@", ""); row1.Add("@金额@", ""); list.Add(row1); v.Value = JsonUtils.Serialize(list); vars.Add(v); v = new Printer.VariableValue(); v.Key = "优惠列表"; v.DataType = DataType.List; var list1 = new List>(); //删除优惠信息打印 foreach (var item in response.Extras) { if (!string.IsNullOrEmpty(item.Remark)) { var row = new Dictionary(); row.Add("@名称@", item.Remark); list1.Add(row); } } v.Value = JsonUtils.Serialize(list1); vars.Add(v); return vars; } /// /// 构建商家美团外卖订单打印 /// /// /// public static List SJBuilderMeiTuanVariable(string meituanShop, ShopMeituanWaiMaiOrderInfoByidResponse response, bool isRprint) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@营业模式@", OrderType.美团外卖.ToString()); data.Add("@退单标识@", "false"); data.Add("@退单@", response.Status == 9 ? "已退单" : "完成"); data.Add("@外卖门店@", meituanShop); data.Add("@外卖单号@", response.Wm_order_id_view); if (response.Pay_type == 1) { data.Add("@支付方式@", "货到付款"); } else if (response.Pay_type == 2) { data.Add("@支付方式@", "在线支付"); } else { data.Add("@支付方式@", "其他支付方式"); } if (response.PickType == 0) { data.Add("@是否到店自取@", "false"); } else { data.Add("@是否到店自取@", "true"); } if (response.Delivery_time.Equals("0")) { data.Add("@是否预定@", "false"); data.Add("@预定单标识@", ""); data.Add("@送达时间@", "立即送达"); } else { data.Add("@是否预定@", "true"); data.Add("@预定单标识@", "预订单"); data.Add("@送达时间@", GetFormatDateTime4Sec(response.Delivery_time)); } data.Add("@就餐人数@", response.Dinners_number.ToString()); data.Add("@订单备注@", response.Caution); if (isRprint) { data.Add("@是否补打@", "(补打单)"); data.Add("@重打标识@", "true"); } else { data.Add("@是否补打@", ""); data.Add("@重打标识@", "false"); } data.Add("@下单时间@", GetFormatDateTime4Sec(response.Order_send_time)); data.Add("@当日序号@", string.Format("{0}", response.Day_seq)); data.Add("@订餐人@", response.Recipient_name); data.Add("@订餐电话@", response.Recipient_phone); if (!string.IsNullOrEmpty(response.Recipient_address)) { string[] addressArray = Regex.Split(response.Recipient_address, "@#", RegexOptions.IgnoreCase); data.Add("@送餐地址@", addressArray[0]); } else { data.Add("@送餐地址@", ""); } data.Add("@配送费用@", string.Format("{0}", response.Shipping_fee)); data.Add("@订单原价@", string.Format("{0}", response.Original_price)); data.Add("@订单总额@", string.Format("{0}", response.Total)); if (response.Has_invoiced == 0) { data.Add("@是否发票@", string.Format("{0}", "false")); } else { data.Add("@是否发票@", string.Format("{0}", "true")); } data.Add("@发票信息@", string.Format("{0}", response.Invoice_title)); int countExtras = 0; foreach (var item in response.Extras) { if (!string.IsNullOrEmpty(item.Remark)) { countExtras = countExtras + 1; } } if (countExtras > 0) { data.Add("@是否打印优惠明细@", "true"); } else { data.Add("@是否打印优惠明细@", "false"); } decimal packageFee = 0.00M; //口袋列表 List listDetail = response.Detail.OrderBy(x => x.Sku_id).ToList(); foreach (var item in listDetail) { packageFee = packageFee + item.Box_num * item.Box_price; } data.Add("@餐盒费@", string.Format("{0}", packageFee)); v.Value = JsonUtils.Serialize(data); vars.Add(v); v = new Printer.VariableValue(); v.Key = "点餐列表"; v.DataType = DataType.List; var list = new List>(); //口袋列表 //List listDetail = response.Detail.OrderBy(x => x.Cart_id).ToList(); int i = -1; foreach (var item in listDetail) { var row = new Dictionary(); if (i != item.Cart_id) { row = new Dictionary(); row.Add("@名称@", "----" + (item.Cart_id + 1) + "号口袋----"); row.Add("@数量@", ""); row.Add("@金额@", ""); list.Add(row); i = item.Cart_id; } Tuple nameAdd = Global.Instance.Additional; row = new Dictionary(); row.Add("@名称@", item.Food_name + (string.IsNullOrEmpty(item.Spec) ? "" : nameAdd.Item1 + item.Spec + nameAdd.Item2) + (string.IsNullOrEmpty(item.Food_property) ? "" : nameAdd.Item1 + item.Food_property + nameAdd.Item2)); row.Add("@数量@", string.Format("{0}", item.Quantity)); row.Add("@金额@", string.Format("{0}", StringUtils.GetDecimal(item.Quantity) * item.Price)); list.Add(row); packageFee = packageFee + item.Box_num * item.Box_price; } var row1 = new Dictionary(); row1.Add("@名称@", "-------------"); row1.Add("@数量@", ""); row1.Add("@金额@", ""); list.Add(row1); v.Value = JsonUtils.Serialize(list); vars.Add(v); v = new Printer.VariableValue(); v.Key = "优惠列表"; v.DataType = DataType.List; var list1 = new List>(); //删除优惠信息打印 foreach (var item in response.Extras) { if (!string.IsNullOrEmpty(item.Remark)) { var row = new Dictionary(); row.Add("@名称@", item.Remark); list1.Add(row); } } v.Value = JsonUtils.Serialize(list1); vars.Add(v); return vars; } private static string GetFormatDateTime4Sec(string secTimeStamp, string format = null) { if (string.IsNullOrEmpty(secTimeStamp)) return ""; try { format = format ?? "yyyy-MM-dd HH:mm:ss"; if (secTimeStamp.Length == 13) { secTimeStamp = secTimeStamp.Substring(0, 10); } double timestamp = Convert.ToInt64(secTimeStamp); System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); dateTime = dateTime.AddSeconds(timestamp).ToLocalTime(); return dateTime.ToString(format); //System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 //DateTime dt = startTime.AddSeconds(long.Parse(secTimeStamp)); //return dt.ToString(format); }catch(Exception ex) { logger.Error(ex, "时间转换异常"); return ""; } } /// /// 构建饿了么订单打印 /// /// /// public static List BuilderEleMeVariable(string elemeShop, EleMeOrderResponse response, bool isRprint) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@营业模式@", OrderType.饿了么.ToString()); data.Add("@退单标识@", "false"); data.Add("@外卖单号@", response.OrderId); data.Add("@外卖门店@", elemeShop); if (response.IsOnlinePaid) { data.Add("@支付方式@", "在线支付"); } else { data.Add("@支付方式@", "货到付款"); } if (!response.IsBook) { data.Add("@是否预定@", "false"); data.Add("@预定单标识@", ""); data.Add("@送达时间@", "立即送达"); } else { data.Add("@是否预定@", "true"); data.Add("@预定单标识@", "预订单"); data.Add("@送达时间@", response.DeliverTime); } //data.Add("@送达时间@", response.DeliverTime); data.Add("@就餐人数@", "1"); data.Add("@订单备注@", response.Description); if (isRprint) { data.Add("@是否补打@", "(补打单)"); data.Add("@重打标识@", "true"); } else { data.Add("@是否补打@", ""); data.Add("@重打标识@", "false"); } data.Add("@下单时间@", response.CreatedAt); data.Add("@当日序号@", string.Format("{0}", response.DaySn)); data.Add("@订餐人@", response.Consignee); data.Add("@订餐电话@", StringUtils.GetString(response.PhoneList).Replace("[", "").Replace("]", "").Replace("\r", "").Replace("\n", "").Replace("\"", "")); data.Add("@送餐地址@", response.Address); data.Add("@订单原价@", string.Format("{0}", response.OriginalPrice)); data.Add("@订单总额@", string.Format("{0}", response.TotalPrice)); data.Add("@配送费用@", string.Format("{0}", response.DeliverFee)); if (response.Invoiced) { data.Add("@是否发票@", string.Format("{0}", "true")); } else { data.Add("@是否发票@", string.Format("{0}", "false")); } data.Add("@发票信息@", string.Format("{0}", response.Invoice)); v.Value = JsonUtils.Serialize(data); vars.Add(v); v = new Printer.VariableValue(); v.Key = "点餐列表"; v.DataType = DataType.List; List grops = response.Groups; List items = new List(); var list = new List>(); foreach (EleMeGroups group in grops) { var row = new Dictionary(); row.Add("@名称@", group.Name); row.Add("@数量@", string.Format("{0}", "-")); row.Add("@金额@", string.Format("{0}", "-")); list.Add(row); foreach (EleMeDishItem item in group.Items) { var rows = new Dictionary(); rows.Add("@名称@", item.Name); rows.Add("@数量@", string.Format("{0}", item.Quantity)); rows.Add("@金额@", string.Format("{0}", item.Total)); list.Add(rows); } } v.Value = JsonUtils.Serialize(list); vars.Add(v); return vars; } ///// ///// 构建百度订单打印 ///// ///// ///// //public static List BuilderBaiDuVariable(string baiduShop, BaiDuOrderResponse response, bool isRprint) //{ // var vars = new List(); // var v = new Printer.VariableValue(); // v.Key = "默认数据源"; // v.DataType = DataType.Simple; // var data = new Dictionary(); // data.Add("@营业模式@", OrderType.百度外卖.ToString()); // data.Add("@退单标识@", "false"); // data.Add("@外卖单号@", response.OrderBody.OrderData.OrderInfo.Order_id); // data.Add("@外卖门店@", baiduShop); // if (response.OrderBody.OrderData.OrderInfo.Pay_type == 2) // { // data.Add("@支付方式@", "在线支付"); // } // else // { // data.Add("@支付方式@", "货到付款"); // } // if (StringUtils.GetInt(response.OrderBody.OrderData.OrderInfo.Send_time) > 1000) // { // data.Add("@送达时间@", DateTimeUtils.GetFormatDateTime4Sec(response.OrderBody.OrderData.OrderInfo.Send_time)); // } // else // { // data.Add("@送达时间@", "立即送达"); // } // data.Add("@就餐人数@", "1"); // data.Add("@订单备注@", response.OrderBody.OrderData.OrderInfo.Remark); // if (isRprint) // { // data.Add("@是否补打@", "(补打单)"); // data.Add("@重打标识@", "true"); // } // else // { // data.Add("@是否补打@", ""); // data.Add("@重打标识@", "false"); // } // data.Add("@下单时间@", DateTimeUtils.GetFormatDateTime4Sec(response.OrderBody.OrderData.OrderInfo.Create_time)); // data.Add("@当日序号@", string.Format("{0}", response.OrderBody.OrderData.OrderInfo.Order_index)); // data.Add("@订餐人@", response.OrderBody.OrderData.OrderUser.Name); // data.Add("@订餐电话@", response.OrderBody.OrderData.OrderUser.Phone); // data.Add("@送餐地址@", response.OrderBody.OrderData.OrderUser.Address); // data.Add("@订单原价@", StringUtils.GetString(response.OrderBody.OrderData.OrderInfo.Total_fee / Convert.ToDecimal(100))); // data.Add("@订单总额@", StringUtils.GetString(response.OrderBody.OrderData.OrderInfo.Total_fee / Convert.ToDecimal(100))); // data.Add("@配送费用@", StringUtils.GetString(response.OrderBody.OrderData.OrderInfo.Send_fee / Convert.ToDecimal(100))); // v.Value = JsonUtils.Serialize(data); // vars.Add(v); // v = new Printer.VariableValue(); // v.Key = "点餐列表"; // v.DataType = DataType.List; // List> products = response.OrderBody.OrderData.Products; // List items = new List(); // foreach (List group in products) // { // foreach (BaiduOrderProduct item in group) // { // item.ProductPrice = item.Product_price / Convert.ToDecimal(100); // item.ProductFee = item.Product_fee / Convert.ToDecimal(100); // var spec = ""; // var specId = ""; // if (item.Product_attr != null) // { // foreach (var attr in item.Product_attr) // { // spec += string.Format("({0})", attr.Option); // specId = attr.Baidu_attr_id; // } // } // item.Spec = spec;//菜如菜品规格 // item.SpecId = specId; // var features = string.Empty; // if (item.Product_features != null) // { // foreach (var feature in item.Product_features) // { // features += string.Format("{0},", feature.Option); // } // if (!string.IsNullOrEmpty(features)) // { // features = features.Substring(0, features.Length - 1); // features = string.Format("({0})", features); // } // } // item.Features = features;//写入菜品做法 // items.Add(item); // } // } // var list = new List>(); // foreach (var item in items) // { // var row = new Dictionary(); // if (item.Spec != null && !"".Equals(item.Spec)) // { // Tuple nameAdd = Global.Instance.Additional; // row.Add("@名称@", item.Product_name + nameAdd.Item1 + item.Spec + nameAdd.Item2); // } // else // { // row.Add("@名称@", item.Product_name); // } // row.Add("@数量@", string.Format("{0}", item.Product_amount)); // row.Add("@金额@", string.Format("{0}", item.ProductFee)); // list.Add(row); // } // v.Value = JsonUtils.Serialize(list); // vars.Add(v); // return vars; //} /// /// 构建微信订单打印 /// /// /// public static List BuilderWeiXinVariable(WeiXinOrderResponse response, bool isRprint) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@单号@", response.TicketNo); data.Add("@取餐号@", response.TakeNo); data.Add("@门店名称@", Global.Instance.Worker.StoreInfo.PrintName); if (response.PayType == 1) { data.Add("@付款方式@", "在线支付"); } else { data.Add("@付款方式@", "其他"); } if (response.PayMode == 1) { data.Add("@付款类型@", "微信支付"); } else { data.Add("@付款类型@", "其他支付"); } data.Add("@下单时间@", response.PayDate); if (response.Status == 1) { data.Add("@订单状态@", "已支付"); } else if (response.Status == 2) { data.Add("@订单状态@", "已退单"); } else if (response.Status == 3) { data.Add("@订单状态@", "已取消"); } else if (response.Status == 4) { data.Add("@订单状态@", "商家已确认"); } else if (response.Status == 5) { data.Add("@订单状态@", "已完成"); } data.Add("@就餐人数@", string.Format("{0}", response.People)); if (response.BusMode == 0) { data.Add("@营业模式@", "堂食"); data.Add("@手机号@", response.Phone); data.Add("@是否打印餐盒费@", "false"); data.Add("@是否打印取餐信息@", "true"); data.Add("@是否打印配送信息@", "false"); data.Add("@点餐人@", ""); data.Add("@订餐地址@", ""); } else if (response.BusMode == 1) { data.Add("@营业模式@", "打包"); data.Add("@手机号@", response.Phone); data.Add("@是否打印餐盒费@", "true"); data.Add("@是否打印取餐信息@", "true"); data.Add("@是否打印配送信息@", "false"); data.Add("@点餐人@", ""); data.Add("@订餐地址@", ""); } else if (response.BusMode == 2) { data.Add("@营业模式@", "外卖"); data.Add("@手机号@", response.ReceiveMobile == null ? "" : response.ReceiveMobile); data.Add("@是否打印餐盒费@", "true"); data.Add("@是否打印取餐信息@", "false"); data.Add("@是否打印配送信息@", "true"); data.Add("@点餐人@", response.ReceiveName == null ? "" : response.ReceiveName); data.Add("@订餐地址@", response.ReceiveAddress == null ? "" : response.ReceiveAddress); } else { data.Add("@营业模式@", "其他"); data.Add("@手机号@", response.Phone); data.Add("@是否打印餐盒费@", "false"); data.Add("@是否打印取餐信息@", "false"); data.Add("@是否打印配送信息@", "false"); data.Add("@点餐人@", ""); data.Add("@订餐地址@", ""); } data.Add("@餐桌号@", response.TableName == null ? "" : response.TableName); data.Add("@订单备注@", response.Description == null ? "" : response.Description); if (isRprint) { data.Add("@是否补打@", "(补打单)"); } else { data.Add("@是否补打@", ""); } data.Add("@订单原价@", StringUtils.GetString(response.Amount)); data.Add("@优惠金额@", StringUtils.GetString(response.DiscountTotal)); data.Add("@应收金额@", StringUtils.GetString(response.Receivable)); data.Add("@餐盒费@", StringUtils.GetString(response.BoxFee)); data.Add("@配送费用@", StringUtils.GetString(response.DistributionFee)); data.Add("@退单原因@", response.BackCause); v.Value = JsonUtils.Serialize(data); vars.Add(v); v = new Printer.VariableValue(); v.Key = "点餐列表"; v.DataType = DataType.List; var list = new List>(); foreach (WeiXinOrderItems item in response.Items) { var row = new Dictionary(); if (item.SpecName != null && !"".Equals(item.SpecName)) { Tuple nameAdd = Global.Instance.Additional; row.Add("@名称@", item.ProductName + nameAdd.Item1 + item.SpecName + nameAdd.Item2); } else { row.Add("@名称@", item.ProductName); } row.Add("@数量@", string.Format("{0}", item.ProductCount)); row.Add("@金额@", string.Format("{0}", item.ProductFee)); list.Add(row); if (!"".Equals(item.ProductMakes)) { row = new Dictionary(); row.Add("@名称@", "-" + item.ProductMakes); row.Add("@数量@", ""); row.Add("@金额@", ""); list.Add(row); } } v.Value = JsonUtils.Serialize(list); vars.Add(v); return vars; } /// /// 构建微信订单打印 /// /// /// public static List UserCancelOrders(OrderObject _data, string orderNo, string SourceName) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@外卖来源@", SourceName); data.Add("@当日序号@", _data.OrderNo); data.Add("@外卖单号@", orderNo); data.Add("@下单时间@", _data.CreateDate); data.Add("@支付方式@", _data.Pays.FirstOrDefault()?.Name); v.Value = JsonUtils.Serialize(data); vars.Add(v); var list = new List>(); v = new Printer.VariableValue(); v.Key = "点餐列表"; v.DataType = DataType.List; foreach (var item in _data.Items) { var row = new Dictionary(); if (item.SpecName != null && !"".Equals(item.SpecName)) { Tuple nameAdd = Global.Instance.Additional; row.Add("@名称@", item.Name + nameAdd.Item1 + item.SpecName + nameAdd.Item2); } else { row.Add("@名称@", item.Name); } row.Add("@数量@", string.Format("{0}", item.Quantity)); row.Add("@金额@", string.Format("{0}", item.SalePrice)); list.Add(row); } v.Value = JsonUtils.Serialize(list); vars.Add(v); return vars; } /// /// 构建微信订单打印 /// /// /// public static List BuilderWeiXinVariable(OrderObject response, bool isRprint) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; bool otherWaimaiSet = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_MEITUANEXPRESSCOST, false); var data = new Dictionary(); data.Add("@单号@", response.TradeNo); data.Add("@取餐号@", response.OrderNo); data.Add("@就餐时间@", response.ReserveTime); data.Add("@预约送达@", response.ReserveTime); data.Add("@门店名称@", Global.Instance.Worker.StoreInfo.PrintName); if (response.Pays?.Count == 1) { data.Add("@付款方式@", "在线支付"); data.Add("@付款类型@", response.Pays.FirstOrDefault().Name); } else { data.Add("@付款方式@", "其他"); data.Add("@付款方式@", "其他"); } data.Add("@下单时间@", response.FinishDate); if (response.OrderStatus == OrderStatus.已取消) { data.Add("@是否打印状态@", "true"); } else { data.Add("@是否打印状态@", "false"); } switch (response.OrderStatus) { case OrderStatus.新建单: data.Add("@订单状态@", "新建单"); break; case OrderStatus.等待付款: data.Add("@订单状态@", "等待付款"); break; case OrderStatus.已支付: data.Add("@订单状态@", "已支付"); break; case OrderStatus.已退单: data.Add("@订单状态@", "已退单"); break; case OrderStatus.已取消: data.Add("@订单状态@", "已取消"); break; case OrderStatus.已完成: data.Add("@订单状态@", "已完成"); break; case OrderStatus.部分退款: data.Add("@订单状态@", "部分退款"); break; default: break; } data.Add("@就餐人数@", string.Format("{0}", response.People)); switch (response.OrderType) { case OrderType.微信点餐: //zhangy 2020-02-18 Add 添加以下代码,解决外卖模式下打印点餐人、手机号、订餐地址,其他情况不打印 data.Add("@营业模式@", response.BusMode); data.Add("@是否打印餐盒费@", "ture"); data.Add("@是否打印取餐信息@", response.BusMode == "堂食" ? "true" : "false"); data.Add("@手机号@", response.Phone == null ? "" : response.Phone); data.Add("@是否打印手机号@", response.BusMode == "外卖" ? "true" : "false"); data.Add("@点餐人@", response.Recipients == null ? "" : response.Recipients); data.Add("@是否打印点餐人@", response.BusMode == "外卖" ? "true" : "false"); data.Add("@订餐地址@", response.Address == null ? "" : response.Address); data.Add("@是否打印配送信息@", response.BusMode == "外卖" ? "true" : "false"); data.Add("@是否堂食@", response.BusMode == "堂食" ? "true" : "false"); data.Add("@是否外卖@", response.BusMode == "外卖" ? "true" : "false"); data.Add("@是否外带@", response.BusMode == "外带" ? "true" : "false"); data.Add("@预约时间@", ""); //zhangy 2020-02-18 Edit 注释以下代码,堂食和外带打印小票数据不一样,不能按照是否有地址来区分 //if (!string.IsNullOrEmpty(response.Address)) //{ // //外卖模式 // data.Add("@营业模式@", response.BusMode); // data.Add("@手机号@", response.Phone == null ? "" : response.Phone); // data.Add("@是否打印餐盒费@", "ture"); // data.Add("@是否打印取餐信息@", "false"); // data.Add("@是否打印配送信息@", "true"); // data.Add("@点餐人@", response.Recipients == null ? "" : response.Recipients); // data.Add("@订餐地址@", response.Address == null ? "" : response.Address); // data.Add("@预约时间@", ""); //} break; case OrderType.美团外卖: if (!string.IsNullOrEmpty(response.Address)) { //外卖模式 data.Add("@营业模式@", response.BusMode); data.Add("@手机号@", response.Phone == null ? "" : response.Phone); data.Add("@是否打印餐盒费@", "ture"); data.Add("@是否打印取餐信息@", "false"); data.Add("@是否打印配送信息@", "true"); data.Add("@点餐人@", response.Recipients == null ? "" : response.Recipients); data.Add("@订餐地址@", response.Address == null ? "" : response.Address); } //zhangy 2020-03-14 Edit data.Add("@是否堂食@", "false"); data.Add("@是否外卖@", "false"); data.Add("@是否外带@", "false"); data.Add("@预约时间@", ""); break; default: data.Add("@营业模式@", "微信小程序"); data.Add("@手机号@", ""); data.Add("@是否打印餐盒费@", "false"); data.Add("@是否打印取餐信息@", "true"); data.Add("@是否打印配送信息@", "false"); data.Add("@点餐人@", ""); data.Add("@订餐地址@", ""); break; } data.Add("@餐桌号@", response.TableName == null ? "" : response.TableName); data.Add("@订单备注@", response.Ext1 == null ? "" : response.Ext1); if (isRprint) { data.Add("@是否补打@", "true"); } else { data.Add("@是否补打@", "false"); } if (otherWaimaiSet) { data.Add("@订单原价@", StringUtils.GetString(response.Amount)); data.Add("@应收金额@", StringUtils.GetString(response.ReceivableAmount)); } else { data.Add("@订单原价@", StringUtils.GetString(response.Amount + response.DeliverFee)); data.Add("@应收金额@", StringUtils.GetString(response.ReceivableAmount + response.DeliverFee)); } data.Add("@优惠金额@", StringUtils.GetString(response.DiscountAmount)); data.Add("@餐盒费@", StringUtils.GetString(response.BoxFee)); data.Add("@配送费用@", StringUtils.GetString(response.DeliverFee)); //data.Add("@退单原因@", response.BackCause); v.Value = JsonUtils.Serialize(data); vars.Add(v); v = new Printer.VariableValue(); v.Key = "点餐列表"; v.DataType = DataType.List; var list = new List>(); foreach (var item in response.Items.Where(f=>!f.Name.Equals("打包费")&&!f.Name.Equals("配送费"))) { var row = new Dictionary(); if (item.SpecName != null && !"".Equals(item.SpecName)) { Tuple nameAdd = Global.Instance.Additional; row.Add("@名称@", item.Name + nameAdd.Item1 + item.SpecName + nameAdd.Item2); } else { row.Add("@名称@", item.Name); } row.Add("@数量@", string.Format("{0}", item.Quantity)); row.Add("@金额@", string.Format("{0}", item.ReceivableAmount)); row.Add("@原价@", string.Format("{0}", item.Amount)); list.Add(row); var _fla = item.Flavors.Where(f => !f.Description.Equals("打包费") && !f.Description.Equals("配送费") && !f.Description.Equals("商家优惠")).ToList(); foreach (var _flavor in _fla) { row = new Dictionary(); if (_flavor.Name.Equals("")) { continue; } row.Add("@名称@", "-" + _flavor.Name); row.Add("@数量@", _flavor.Quantity.ToString()); row.Add("@金额@", _flavor.Amount.ToString()); row.Add("@原价@", _flavor.Amount.ToString()); list.Add(row); } } v.Value = JsonUtils.Serialize(list); vars.Add(v); return vars; } /// /// 构建企迈订单打印 /// /// /// public static List BuilderQiMaiVariable(QiMaiOrder response, bool isRprint) { var vars = new List(); var v = new Printer.VariableValue(); v.Key = "默认数据源"; v.DataType = DataType.Simple; var data = new Dictionary(); data.Add("@单号@", response.OrderNo); data.Add("@取餐号@", response.SortNum); data.Add("@门店名称@", response.MultiStoreName); data.Add("@付款方式@", "在线支付"); QiMaiOrderPay pays = response.orderPays; if (pays != null) { data.Add("@付款类型@", pays.Name); } else { data.Add("@付款类型@", "其他支付"); } data.Add("@下单时间@", response.CreatedTime); data.Add("@订单状态@", response.StatusText); data.Add("@就餐人数@", string.Format("{0}", response.PeopleNumber)); if (response.TypeCate == 3) { //外卖模式 data.Add("@营业模式@", response.TypeCateText); data.Add("@手机号@", response.AcceptMobile == null ? "" : response.AcceptMobile); data.Add("@是否打印餐盒费@", "ture"); data.Add("@是否打印取餐信息@", "false"); data.Add("@是否打印配送信息@", "true"); data.Add("@点餐人@", response.AcceptName == null ? "" : response.AcceptName); data.Add("@订餐地址@", response.Address == null ? "" : response.Address); data.Add("@预约时间@", ""); } else if (response.TypeCate == 2) { //堂食模式 data.Add("@营业模式@", response.TypeCateText); data.Add("@手机号@", response.Moblie == null ? "" : response.Moblie); data.Add("@是否打印餐盒费@", "false"); data.Add("@是否打印取餐信息@", "true"); data.Add("@是否打印配送信息@", "false"); data.Add("@点餐人@", ""); data.Add("@订餐地址@", ""); data.Add("@预约时间@", ""); } else if (response.TypeCate == 1) { //买单模式 data.Add("@营业模式@", response.TypeCateText); data.Add("@手机号@", ""); data.Add("@是否打印餐盒费@", "false"); data.Add("@是否打印取餐信息@", "false"); data.Add("@是否打印配送信息@", "false"); data.Add("@点餐人@", ""); data.Add("@订餐地址@", ""); data.Add("@预约时间@", ""); } else if (response.TypeCate == 6) { //预约模式 data.Add("@营业模式@", response.TypeCateText); data.Add("@手机号@", response.Moblie == null ? "" : response.Moblie); data.Add("@是否打印餐盒费@", "false"); data.Add("@是否打印取餐信息@", "false"); data.Add("@是否打印配送信息@", "false"); data.Add("@点餐人@", ""); data.Add("@订餐地址@", ""); data.Add("@预约时间@", response.MealTime); } data.Add("@餐桌号@", response.TableNumber == null ? "" : response.TableNumber); data.Add("@订单备注@", response.Postscript == null ? "" : response.Postscript); if (isRprint) { data.Add("@是否补打@", "(补打单)"); } else { data.Add("@是否补打@", ""); } data.Add("@订单原价@", StringUtils.GetString(response.TotalAmount)); data.Add("@优惠金额@", StringUtils.GetString(response.MinusAmount)); data.Add("@应收金额@", StringUtils.GetString(response.TotalAmount - response.MinusAmount)); data.Add("@餐盒费@", StringUtils.GetString(response.TablewarePrice)); data.Add("@配送费用@", StringUtils.GetString(response.Freight)); data.Add("@退单原因@", ""); v.Value = JsonUtils.Serialize(data); vars.Add(v); v = new Printer.VariableValue(); v.Key = "点餐列表"; v.DataType = DataType.List; var list = new List>(); foreach (QiMaiOrderItem item in response.orderItems.Goods) { var row = new Dictionary(); if (item.Spec != null && !"".Equals(item.Spec) && !"[]".Equals(item.Spec.ToString())) { string specName = ""; Dictionary map = JsonUtils.Deserialize>(item.Spec.ToString()); foreach (var mapValue in map) { specName = mapValue.Value + ","; } if (specName != null && !"".Equals(specName)) { specName = specName.Substring(0, specName.Length - 1); } string attachgoods = ""; if (item.OrderAttachGoods != null && !"".Equals(item.OrderAttachGoods) && !"[]".Equals(item.OrderAttachGoods)) { List attachGoods = JsonUtils.Deserialize>(item.OrderAttachGoods.ToString()); foreach (QiMaiOrderAttachGoods qiMaiOrderAttachGoods in attachGoods) { attachgoods = "," + attachgoods + string.Format("{0}*{1}", qiMaiOrderAttachGoods.Name, qiMaiOrderAttachGoods.Qty); } } item.PropertyName = string.Format("{0}{1}", item.Property, attachgoods); if (item.Property != null && !"".Equals(item.PropertyName)) { specName = specName + "," + item.PropertyName; } Tuple nameAdd = Global.Instance.Additional; row.Add("@名称@", item.Name + nameAdd.Item1 + specName + nameAdd.Item2); } else { string attachgoods = ""; if (item.OrderAttachGoods != null && !"".Equals(item.OrderAttachGoods) && !"[]".Equals(item.OrderAttachGoods)) { List attachGoods = JsonUtils.Deserialize>(item.OrderAttachGoods.ToString()); foreach (QiMaiOrderAttachGoods qiMaiOrderAttachGoods in attachGoods) { attachgoods = "," + attachgoods + string.Format("{0}*{1}", qiMaiOrderAttachGoods.Name, qiMaiOrderAttachGoods.Qty); } } item.PropertyName = string.Format("{0}{1}", item.Property, attachgoods); if (item.PropertyName != null && !"".Equals(item.PropertyName)) { Tuple nameAdd = Global.Instance.Additional; row.Add("@名称@", item.Name + nameAdd.Item1 + item.PropertyName + nameAdd.Item2); } else { row.Add("@名称@", item.Name); } } row.Add("@数量@", string.Format("{0}", item.Num)); row.Add("@金额@", string.Format("{0}", item.Price * item.Num)); list.Add(row); } v.Value = JsonUtils.Serialize(list); vars.Add(v); return vars; } public static Tuple PrinterTicket(string prefix, List args) { Tuple result = null; try { //票头空白行 int headerLine = 0; //票尾空白行 int footerLine = 0; //小票打印份数 int ticketCount = 1; //打印延迟 int delaySecond = 1; //切纸 bool cutPager = false; PrinterObject pobject = null; //打印票据类型,是否打印厨打票,否则打印小票 var printKitchen = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_WM_PRINTERKITCHERTICKET, false); //单独配置外卖打印机 var wmPrinterAlone = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_WM_WMPRINTERALONE, false); //厨打机同时打印外卖厨打票(适用于菜品未映射的厨打模式) var wmPrinterKit = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_WM_WMPRINTERKIT, false); wmPrinterAlone = wmPrinterAlone && !prefix.Contains("微信订单") && !prefix.Contains("在线订单");//排除微信订单,微信订单不算外卖,不走单独打印小票 if (wmPrinterAlone) { //外卖打印机单独使用 cutPager = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_WM_CASHIER_ALLOW_CUT_PAGER, false); //打印延迟 delaySecond = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_WM_CASHIER_PRINT_DELAY, 1); //小票打印份数 ticketCount = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_WM_CASHIER_TICKET_COUNT, 1); //票尾空白行 footerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_WM_CASHIER_FOOTER_EMPTY, 0); //票头空白行 headerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_WM_CASHIER_HEADER_EMPTY, 0); //打印机 pobject = GetTicketPrinterObject("外卖打印机", cutPager, false); } //else if (wmPrinterKit) { // //同时发往所有厨打打印机 //} else { //和小票机共用的打印机 cutPager = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_CASHIER_ALLOW_CUT_PAGER, false); //打印延迟 delaySecond = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_PRINT_DELAY, 1); //小票打印份数 ticketCount = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_TICKET_COUNT, 1); //票尾空白行 footerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_FOOTER_EMPTY, 0); //票头空白行 headerLine = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_HEADER_EMPTY, 0); //打印机 pobject = GetTicketPrinterObject("收银台打印机", cutPager, false); } for (int i = 1; i <= ticketCount; i++) { //执行收银小票打印 logger.Info("开始打印外卖收银小票"); if (wmPrinterAlone && printKitchen) { var tempPrefix = "外卖厨打"; var prt = PrinterTicket(pobject, tempPrefix, args, cutPager, false, headerLine, footerLine); logger.Info("外卖打印机打印厨打模板第<{0}>次小票打印结果<{1},{2}>", i, prt.Item1, prt.Item2); } else { var prt = PrinterTicket(pobject, prefix, args, cutPager, false, headerLine, footerLine); logger.Info("外卖第<{0}>次小票打印结果<{1},{2}>", i, prt.Item1, prt.Item2); } if (delaySecond > 0) { Thread.Sleep(delaySecond * 1000); } } //外卖单独打印且收银台同时打印,继续执行收银台打印 var toDeskSame = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_WM_CASHIER_TICKET_TODESKSAME, false); if (wmPrinterAlone && toDeskSame) { var deskTicketCount = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_WM_CASHIER_DESK_TICKET_COUNT, 0); //执行收银小票打印 var deskPrinterObject = GetTicketPrinterObject("收银台打印机", cutPager, false); for (int i = 1; i <= deskTicketCount; i++) { logger.Info("开始打印外卖收银小票收银台打印"); var prt = PrinterTicket(deskPrinterObject, prefix, args, cutPager, false, headerLine, footerLine); logger.Info("外卖第<{0}>次小票收银台打印结果<{1},{2}>", i, prt.Item1, prt.Item2); if (delaySecond > 0) { Thread.Sleep(delaySecond * 1000); } } } result = new Tuple(true, "打印成功"); } catch (Exception ex) { logger.Error(ex, "外卖小票打印异常"); result = new Tuple(false, "外卖小票打印异常"); } return result; } public static Tuple PrinterTicket(PrinterObject pobject, string prefix, List args, bool cutPager, bool openCashbox, int headerLine, int footerLine) { Tuple result = null; try { string fileName = string.Format(@"template\waimaiPrint\{0}_{1}_{2}.designer", prefix, Global.Instance.Authc.TenantId, pobject.PageWidth); string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName); if (!File.Exists(filePath)) { fileName = string.Format(@"template\waimaiPrint\{0}_通用模版_{1}.designer", prefix, pobject.PageWidth); } string template = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName); if (File.Exists(template)) { string json = System.IO.File.ReadAllText(template); DesignerSurface surface = JSON.Deserialize(json); if (pobject.PortType == PortType.驱动 && pobject.Name.Contains("针式驱动打印")) { WinPrint.Print(pobject.Data.FirstOrDefault(f => f.Key == "drive").Value, surface, args); result = new Tuple(true, ""); } else { PrinterTemplate printer = surface.Parse(args); var pcontent = printer.Parse(pobject, args, headerLine, footerLine); result = PrinterUtils.PrintContent(pobject, pcontent); } result = new Tuple(true, "打印成功"); } else { result = new Tuple(false, "打印模版没有配置"); } } catch (Exception ex) { result = new Tuple(false, "打印异常了"); } return result; } } }