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.

627 lines
30 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 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();
/// <summary>
/// 出品
/// </summary>
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<string, List<OrderItem>>();
//点单列表中允许出品的记录集
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<OrderItem>();
}
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<Dictionary<string, KitchenPrinterItem>>(json);
//厨打方案对应的打印机列表
var printers = kobj.Values.ToList();
//执行厨打的订单项
List<OrderItem> result = new List<OrderItem>();
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<bool, string> printResult = null;
switch (pobj.KitType)
{
case 0://一菜一单
{
foreach (var pi in p.Value)
{
var _items = new List<OrderItem>();
_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)
{
}
}
}
/// <summary>
/// 厨打标签
/// </summary>
/// <param name="order"></param>
/// <param name="updateDbPrintNum"></param>
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<Dictionary<string, KitchenPrinterItem>>(json);
//厨打方案对应的打印机列表
var printers = kobj.Values.ToList();
//打印标签的item
IEnumerable<IGrouping<string, OrderItem>> labelPlanGroup = order.Items.FindAll(x => !string.IsNullOrEmpty(x.ChuDaLabelFlag) && x.ChuDaLabelFlag.Equals("1") && x.RowState != OrderRowState.).GroupBy(x => x.ChuDaLabel);
foreach (IGrouping<string, OrderItem> 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<List<LabelTemplate>>(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, "打印厨打标签异常");
}
}
/// <summary>
/// 厨打
/// </summary>
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<string, List<OrderItem>>();
//点单列表中允许厨打的记录集
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<OrderItem>();
}
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<Dictionary<string, KitchenPrinterItem>>(json);
//厨打方案对应的打印机列表
var printers = kobj.Values.ToList();
//执行厨打的订单项
List<OrderItem> result = new List<OrderItem>();
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<bool, string> printResult = null;
switch (pobj.KitType)
{
case 0://一菜一单
{
foreach (var pi in p.Value)
{
var _items = new List<OrderItem>();
_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<bool, string> printResult = null;
switch (pobj.KitType)
{
case 0://一菜一单
{
foreach (var pi in p.Value)
{
var _items = new List<OrderItem>();
_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("打印参数中没有开启厨打");
}
}
}
}