using NLog; using POSV.Bean; using POSV.Entity; using POSV.ShoppingCart; using POSV.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace POSV.Helper { public class ChuDaHelper { private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// 出品 /// public static void MadePrinter(OrderObject orderObject, bool updateDbPrintNum = true) { bool isException = false; try { //是否开启出品 var allowPrinter = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_KITCHEN_ALLOW_CHUPIN, false); if (allowPrinter) { var KITLists = Global.KitPlan._kitPlanList; //厨打方案对应的单品列表 var plans = new Dictionary>(); //点单列表中允许出品的记录集 var lists = orderObject.Items.FindAll(x => !string.IsNullOrEmpty(x.ChupinFlag) && x.ChupinFlag.Equals("1")); if (lists == null || lists.Count() == 0) { logger.Warn("没有配置要出品的商品"); return; } //将厨打记录加工为:方案ID==>集合 foreach (var e in lists) { //如果厨打方案ID不存在,新建 if (!plans.ContainsKey(e.Chupin)) { plans[e.Chupin] = new List(); } plans[e.Chupin].Add(e); } //遍历厨打方案 if (plans.Count > 0) { //获取厨打方案配置参数 var json = Global.Instance.GlobalConfigStringValue(ConfigConstant.PERIPHERAL_KITCHEN_TICKET, string.Empty); //厨打方案是否配置 if (!string.IsNullOrEmpty(json)) { var kobj = JsonUtils.Deserialize>(json); //厨打方案对应的打印机列表 var printers = kobj.Values.ToList(); //执行厨打的订单项 List result = new List(); foreach (var p in plans) { if (printers.Exists(x => x.KitId == p.Key)) { //厨打方案对应的打印机参数 var pobj = printers.Find(x => x.KitId == p.Key); if ("None".Equals(pobj.PrinterItem.Name)) { continue; } KitPlan kitPlan = KITLists.Find(x => p.Key == x.Id); if (kitPlan != null) { orderObject.Ext3 = kitPlan.Name; } Tuple printResult = null; switch (pobj.KitType) { case 0://一菜一单 { foreach (var pi in p.Value) { var _items = new List(); _items.Add(pi); var _vars = PrintHelper.BuilderKitchenVariable(orderObject, _items, pobj, false); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "出品单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(_items); } Thread.Sleep(pobj.Delay * 1000); } } } break; case 1://一小类一单 { var groups = p.Value.GroupBy(x => x.TypeId).ToList(); foreach (var g in groups) { var _vars = PrintHelper.BuilderKitchenVariable(orderObject, g.ToList(), pobj, false); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "出品单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(g.ToList()); } Thread.Sleep(pobj.Delay * 1000); } } } break; case 2://一桌一单 { var _vars = PrintHelper.BuilderKitchenVariable(orderObject, p.Value, pobj, false); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "出品单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(p.Value); } Thread.Sleep(pobj.Delay * 1000); } } break; } if (printResult != null) { logger.Error(printResult.Item2); } else { logger.Error("厨打方案配置不正确"); } } } if(result.Count > 0) { foreach (var item in result) { item.ChupinQty = item.Quantity; } if (updateDbPrintNum) { lock (Global.Instance.SyncLock) { //更新厨打数量 using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { foreach (var item in result) { db.Update(item); } transaction.Complete(); } } } } } } else { logger.Error("尚未配置厨打方案参数"); } } else { logger.Error("没有可用的出品方案"); } } else { logger.Error("收银参数尚未开启出品打印"); } } catch (Exception ex) { } finally { if (!isException) { } } } /// /// 厨打标签 /// /// /// public static void KitchenLabelPrinter(OrderObject order, bool updateDbPrintNum = true) { try { var isLabel = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_KITCHEN_ALLOW_CHUDA_LABEL, false); if (isLabel) { if (order.OrderType == OrderType.饿了么 || order.OrderType == OrderType.美团外卖 || order.OrderType == OrderType.百度外卖) { var enablePrintLabel = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_KITCHEN_ALLOW_WAIMAI_CHUDA_LABEL, false); if (!enablePrintLabel) { logger.Info("厨打标签打印:未启用外卖打印标签"); return; } } //获取厨打方案配置参数 var json = Global.Instance.GlobalConfigStringValue(ConfigConstant.PERIPHERAL_KITCHEN_TICKET, string.Empty); //厨打方案是否配置 if (!string.IsNullOrEmpty(json)) { var kobj = JsonUtils.Deserialize>(json); //厨打方案对应的打印机列表 var printers = kobj.Values.ToList(); //打印标签的item IEnumerable> labelPlanGroup = order.Items.FindAll(x => !string.IsNullOrEmpty(x.ChuDaLabelFlag) && x.ChuDaLabelFlag.Equals("1") && x.RowState != OrderRowState.套餐主).GroupBy(x => x.ChuDaLabel); foreach (IGrouping ig in labelPlanGroup) { var chudaLabel = ig.Key;//厨打标签方案ID var labelRes = LabelPrintHelper.InstallLabelList(order, ig.ToList(), PrintTypeEnum.厨打标签); var labelList = labelRes.Item1; var printItemList = labelRes.Item2; if (labelList.Count > 0) { if (printers.Exists(x => x.KitId == chudaLabel)) { //厨打方案对应的打印机参数 var printer = printers.Find(x => x.KitId == chudaLabel); if ("None".Equals(printer.PrinterItem.Name)) { continue; } var pobj = LabelPrintHelper.Trans2PrinterObject(printer.PrinterItem); var tems = Global.Instance.GlobalConfigStringValue(ConfigConstant.PERIPHERAL_LABEL_TEMPLATE); if (!string.IsNullOrEmpty(tems)) { var temObj = JsonUtils.Deserialize>(tems); if (temObj != null) { var tem = temObj.Find(x => x.Name == "普通标签"); if (tem != null) { LabelPrintHelper.PrintLabel(pobj, tem, labelList); logger.Info("打印订单所有标签完成"); //更新标签打印内容 if (printItemList.Count > 0) { foreach (var item in printItemList) { item.ChuDaLabelQty = item.Quantity; } if (updateDbPrintNum) { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { foreach (var item in printItemList) { db.Update(item); } transaction.Complete(); } } } } } } } else { logger.Error("未配置标签打印模板,不打印"); } } else { logger.Error("未配置标签打印模板,不打印"); } } } } } else { logger.Error("尚未配置厨打方案参数"); } } else { logger.Error("收银参数尚未开启厨打标签"); } } catch(Exception ex) { logger.Error(ex, "打印厨打标签异常"); } } /// /// 厨打 /// public static void KitchenPrinter(OrderObject orderObject, bool updateDbPrintNum = true) { //是否开启厨打 var allowKitchenPrinter = Global.Instance.GlobalConfigBoolValue(ConfigConstant.PERIPHERAL_KITCHEN_ALLOW_CHUDA, false); if (allowKitchenPrinter) { var KITLists = Global.KitPlan._kitPlanList; //厨打方案对应的单品列表 var plans = new Dictionary>(); //点单列表中允许厨打的记录集 var lists = orderObject.Items.FindAll(x => !string.IsNullOrEmpty(x.ChudaFlag) && x.ChudaFlag.Equals("1")).OrderBy(x => x.OrderNo); if(lists == null || lists.Count() == 0) { logger.Warn("没有配置要厨打的商品"); return; } //将厨打记录加工为:方案ID==>集合 foreach (var e in lists) { //如果厨打方案ID不存在,新建 if (!plans.ContainsKey(e.Chuda)) { plans[e.Chuda] = new List(); } plans[e.Chuda].Add(e); } //遍历厨打方案 if (plans.Count > 0) { //获取厨打方案配置参数 var json = Global.Instance.GlobalConfigStringValue(ConfigConstant.PERIPHERAL_KITCHEN_TICKET, string.Empty); //厨打方案是否配置 if (!string.IsNullOrEmpty(json)) { var kobj = JsonUtils.Deserialize>(json); //厨打方案对应的打印机列表 var printers = kobj.Values.ToList(); //执行厨打的订单项 List result = new List(); foreach (var p in plans) { if (printers.Exists(x => x.KitId == p.Key)) { //厨打方案对应的打印机参数 var pobj = printers.Find(x => x.KitId == p.Key); if ("None".Equals(pobj.PrinterItem.Name)) { continue; } KitPlan kitPlan = KITLists.Find(x => p.Key==x.Id); if (kitPlan!=null) { orderObject.Ext3 = kitPlan.Name; } Tuple printResult = null; switch (pobj.KitType) { case 0://一菜一单 { foreach (var pi in p.Value) { var _items = new List(); _items.Add(pi); var _vars = PrintHelper.BuilderKitchenVariable(orderObject, _items, pobj, true); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "厨打单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(_items); } Thread.Sleep(pobj.Delay * 1000); } } } break; case 1://一小类一单 { var groups = p.Value.GroupBy(x => x.TypeId).ToList(); foreach (var g in groups) { var _vars = PrintHelper.BuilderKitchenVariable(orderObject, g.ToList(), pobj, true); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "厨打单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(g.ToList()); } Thread.Sleep(pobj.Delay * 1000); } } } break; case 2://一桌一单 { var _vars = PrintHelper.BuilderKitchenVariable(orderObject, p.Value, pobj, true); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "厨打单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(p.Value); } Thread.Sleep(pobj.Delay * 1000); } } break; } if (printResult != null) { logger.Info(printResult.Item2); } else { logger.Error("厨打方案配置不正确"); } } else { var pobj = printers.FirstOrDefault(); if ("None".Equals(pobj.PrinterItem.Name)) { continue; } KitPlan kitPlan = KITLists.FirstOrDefault(); if (kitPlan != null) { orderObject.Ext3 = kitPlan.Name; } Tuple printResult = null; switch (pobj.KitType) { case 0://一菜一单 { foreach (var pi in p.Value) { var _items = new List(); _items.Add(pi); var _vars = PrintHelper.BuilderKitchenVariable(orderObject, _items, pobj, true); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "厨打单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(_items); } Thread.Sleep(pobj.Delay * 1000); } } } break; case 1://一小类一单 { var groups = p.Value.GroupBy(x => x.TypeId).ToList(); foreach (var g in groups) { var _vars = PrintHelper.BuilderKitchenVariable(orderObject, g.ToList(), pobj, true); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "厨打单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(g.ToList()); } Thread.Sleep(pobj.Delay * 1000); } } } break; case 2://一桌一单 { var _vars = PrintHelper.BuilderKitchenVariable(orderObject, p.Value, pobj, true); if (_vars.Item1) { printResult = PrintHelper.PrinterKitchen(pobj, "厨打单", _vars.Item2, pobj.CutPager == 1, pobj.HeaderEmpty, pobj.FooterEmpty); if (printResult.Item1) { result.AddRange(p.Value); } Thread.Sleep(pobj.Delay * 1000); } } break; } if (printResult != null) { logger.Info(printResult.Item2); } else { logger.Error("厨打方案配置不正确"); } } } if(result.Count > 0) { foreach (var item in result) { item.ChudaQty = item.Quantity; } if (updateDbPrintNum) { lock (Global.Instance.SyncLock) { //更新厨打数量 using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { foreach (var item in result) { //db.Save(item); db.Update(item); } transaction.Complete(); } } } } } } else { logger.Error("尚未配置厨打方案参数"); } } else { logger.Error("没有满足厨打方案的单品"); } } else { logger.Error("打印参数中没有开启厨打"); } } } }