using DevComponents.DotNetBar; using DevComponents.DotNetBar.Controls; using NLog; using POSV.Bean; using POSV.Card; using POSV.Component; using POSV.Entity; using POSV.Helper; using POSV.MessageEvent; using POSV.MsgCenter; using POSV.OtherWaiMai; using POSV.ServiceCenter; using POSV.ShoppingCart; using POSV.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace POSV.WaiMai { public partial class EleMeForm : BusinessForm { private int orderType = 0;//订单类型 private int SelectType = 0;//待处理订单 private bool generalQuerying = false;//历史订单查询锁 private bool handleQuerying = false;//待处理订单查询锁 private bool isBudanFlag = false;//是否正在进行补单操作 private int ConfirmType = 0; private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); public EleMeForm() { InitializeComponent(); this.dateInputPicker.Value = DateTime.Now.Date; //是否开启自动接单 bool openConfirm = Global.Instance.GlobalConfigBoolValue(ConfigConstant.ELEME_CONFIRM_PARAMETER, false); if (openConfirm) { ConfirmType = 1; this.radioButtonOpen.Checked = true; } else { ConfirmType = 0; this.radioButtonClose.Checked = true; } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); //第一步加载门店信息 QueryMeiTuanPoiInfo(); //第二步,获取待处理订单 //第二步,获取待处理订单 Proxy.Mqtt.MqttClientUtils.Instance.OnMessageReceived += Instance_OnMessageReceived; DoHandQuery(); } private void Instance_OnMessageReceived(object sender, Proxy.Mqtt.MessageEventArgs e) { try { string message = e.Message; int type = e.Type; if (type == 0) { Dictionary messageMap = JsonUtils.Deserialize>(message); if (messageMap.ContainsKey("eleme") &&!"".Equals(messageMap["eleme"])) { DoHandQuery(); } } } catch (Exception ex) { LOGGER.Error(ex); } } private void OnControlBoxCloseClick(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void OnControlBoxMinClick(object sender, EventArgs e) { this.WindowState = FormWindowState.Minimized; } private void btn_exit_Click(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void OnCloseTouchClick(object sender, EventArgs e) { //先关闭父窗体 if (this.Owner != null) { this.Owner.Close(); } //再关闭当前窗体 this.Close(); } private void btn_close(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } /// /// 查询全部订单 /// /// /// private void btn_query(object sender, EventArgs e) { var obj = sender as ButtonX; try { obj.Enabled = false; DoQuery(1, pagerControl2.RowsPerPage); } finally { obj.Enabled = true; } } private void DoQuery(int pageNum, int pageSize) { if (generalQuerying) { this.ShowToastNotify(this, "查询中....."); return; } generalQuerying = true; //zhangy 2020-03-01 Add 释放资源,避免Error creating window handle while (tableLayoutPanel2.Controls.Count > 0) { if (tableLayoutPanel2.Controls[0] != null) { var ctl = tableLayoutPanel2.Controls[0]; ctl.Dispose(); } } this.tableLayoutPanel2.Controls.Clear(); Task.Factory.StartNew(() => { EleMeOrderListRequest request = new EleMeOrderListRequest(); string orderDate = this.dateInputPicker.Text; request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.PageNumber = pageNum; request.PageSize = pageSize; request.OrderDate = orderDate; request.Type = orderType; var response = OtherWaiMaiUtils.QueryEleMeOrder(request); if (response != null && response.Item1) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { List detailList = new List(); int handCount = 0; foreach (EleMeOrderListResponse order in response.Item3.List) { if ("pending".Equals(order.Status) || "unprocessed".Equals(order.Status) || "applied".Equals(order.RefundStatus)) { handCount = handCount + 1; } var item = new EleMeItem(order); item.OnConfirm += Item_OnConfirm; item.OnCancel += Item_OnCancel; item.OnRefundAgree += Item_OnRefundAgree; item.OnRefundReject += Item_OnRefundReject; item.OnOrderPrint += Item_OnPrint; item.OnOrderBuDan += Item_OnBuDan; detailList.Add(item); } if (this.IsDisposed || !this.IsHandleCreated) return; //更新控件 sendNewView(handCount); if (detailList.Count > 0) { this.tableLayoutPanel2.Controls.AddRange(detailList.ToArray()); //滚动至顶部 this.tableLayoutPanel2.AutoScrollPosition = new Point(0, 0); } this.pagerControl2.TotalPage = response.Item3.PageCount; this.pagerControl2.CurrentPage = response.Item3.PageNumber; this.pagerControl2.RecordCount = response.Item3.TotalCount; this.pagerControl2.RowsPerPage = response.Item3.PageSize; })); } generalQuerying = false; }); } /// /// 订单打印 /// /// /// private void Item_OnPrint(object sender, EleMeOrderEventArgs e) { Task.Factory.StartNew(() => { string orderId = e.OrderId; EleMeOrderRequest request = new EleMeOrderRequest(); string orderDate = this.dateInputPicker.Text; request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; var response = OtherWaiMaiUtils.EleMeOrder(request); if (response != null && response.Item1) { this.ShowToastNotify(this, "开始打印"); //构建收银小票模版参数 var vars = WaiMaiHelper.BuilderEleMeVariable(response.Item3.Data.ShopName, response.Item3.Data,true); Tuple result = WaiMaiHelper.PrinterTicket("饿了么", vars); this.ShowToastNotify(this, string.Format("{0}", result.Item2)); //组装本地数据 OrderObject orderObject = OtherWaiMaiApi.getOrderLocalEleme(response.Item3.Data); //打印标签 LabelPrintHelper.PrintOrderLabel(orderObject); //执行厨打标签 ChuDaHelper.KitchenLabelPrinter(orderObject); //启用外卖商品绑定厨显方案 var planKds = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_OTHERWAIMAI_PLANKDS, true); //启用外卖商品绑定厨打方案 var planKit = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_OTHERWAIMAI_PLANKIT, true); if (planKit) { //执行厨打 ChuDaHelper.KitchenPrinter(orderObject); logger.Info("饿了么厨打成功"); //执行出品 ChuDaHelper.MadePrinter(orderObject); logger.Info("饿了么出品成功"); } if (planKds) { //通知厨显 UploadSCNewOrder.UploadNewOrder2SC4KDS(orderObject); logger.Info("饿了么厨显成功"); } } }); } /// /// 补单功能 /// /// /// private void Item_OnBuDan(object sender, EleMeOrderEventArgs e) { if (isBudanFlag) { return; } isBudanFlag = true; string orderId = e.OrderId; OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo("5" + orderId); //判断订单是否存在 if (_OrderObject == null) { try { EleMeOrderRequest request1 = new EleMeOrderRequest(); string orderDate = this.dateInputPicker.Text; request1.StoreId = Global.Instance.BusinessPlanLog.StoreId; request1.OrderId = orderId; var response1 = OtherWaiMaiUtils.EleMeOrder(request1); if (response1 != null && response1.Item1) { //组装本地数据 OrderObject orderObject = OtherWaiMaiApi.getOrderLocalEleme(response1.Item3.Data); LOGGER.Info("饿了么组装本地订单"); lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { //遍历获取成本价 foreach (OrderItem item in orderObject.Items) { ProductSpec productSpec = Global.ProductSpec._productSpecList.Find(x => x.Id.Equals(item.SpecId)); if (productSpec != null) { item.CostPrice = productSpec.CostPrice; } else { item.CostPrice = 0.00M; } } //整单 db.Insert(orderObject); //单品明细 db.InsertBatch(orderObject.Items); if (orderObject.Items != null) { //单品优惠 foreach (var promotion in orderObject.Items) { if (promotion.Promotions != null && promotion.Promotions.Count > 0) { db.InsertBatch(promotion.Promotions); } } } //添加支付汇总的必填字段 foreach (PayItem payItem in orderObject.Pays) { var payMode = OrderUtils.GetPayMode(payItem.No); if (payMode == null) { payItem.IncomeFlag = 1; payItem.OtherRateType = 0; payItem.OtherRateValue = 0.00M; } else { payItem.IncomeFlag = payMode.IncomeFlag; payItem.OtherRateType = payMode.OtherRateType; payItem.OtherRateValue = payMode.OtherRateValue; } } //支付明细 db.InsertBatch(orderObject.Pays); //做法明细 foreach (var flavor in orderObject.Items) { if (flavor.Flavors.Count > 0) { db.InsertBatch(flavor.Flavors); } } //8、保存耗料信息 List orderBurdenList = new List(); //第一步组装耗料数量 foreach (var item in orderObject.Items) { //第一步先看看商品是否是管理库存的直销品 var lists = Global.Product._productList; var selectProduct = new List(); selectProduct = lists.FindAll(x => x.Id.Equals(item.ProductId)); if (selectProduct != null && selectProduct.Count > 0) { ProductExt productExt = selectProduct[0]; if (productExt.StockFlag == 1) { OrderProductBurden orderProductBurden = new OrderProductBurden(); orderProductBurden.OrderId = orderObject.Id; orderProductBurden.TenantId = orderObject.TenantId; orderProductBurden.TradeNo = orderObject.TradeNo; orderProductBurden.BurdenProductId = item.ProductId; orderProductBurden.BurdenSpecId = item.SpecId; orderProductBurden.SalesUnitId = item.ProductUnitId; orderProductBurden.SalesAmount = item.Quantity - item.RefundQuantity; orderBurdenList.Add(orderProductBurden); } } //第二步获取门店耗料 StringBuilder sqlBuf = new StringBuilder(); sqlBuf.Append("select burdenProductId,burdenSpecId,salesUnitId,salesAmount from pos_product_burden where productId='{0}' and specId='{1}'"); string productBurdenSql = string.Format(sqlBuf.ToString(), item.ProductId, item.SpecId); List productBurdenList = db.Query(productBurdenSql).ToList(); if (productBurdenList != null && productBurdenList.Count > 0) { foreach (ProductBurden productBurden in productBurdenList) { OrderProductBurden orderProductBurden = new OrderProductBurden(); orderProductBurden.OrderId = orderObject.Id; orderProductBurden.TenantId = orderObject.TenantId; orderProductBurden.TradeNo = orderObject.TradeNo; orderProductBurden.BurdenProductId = productBurden.BurdenProductId; orderProductBurden.BurdenSpecId = productBurden.BurdenSpecId; orderProductBurden.SalesUnitId = productBurden.SalesUnitId; orderProductBurden.SalesAmount = productBurden.SalesAmount * (item.Quantity - item.RefundQuantity); orderBurdenList.Add(orderProductBurden); } } //做法耗料 foreach (var flavorItem in item.Flavors) { StringBuilder sqlBuf1 = new StringBuilder(); sqlBuf1.Append("select burdenProductId,burdenSpecId,salesUnitId,salesAmount from pos_make_burden where makeId='{0}'"); string makeBurdenSql = string.Format(sqlBuf1.ToString(), flavorItem.MakeId); List makeBurdenList = db.Query(makeBurdenSql).ToList(); if (makeBurdenList != null && makeBurdenList.Count > 0) { foreach (MakeBurden makeBurden in makeBurdenList) { OrderProductBurden orderProductBurden = new OrderProductBurden(); orderProductBurden.OrderId = orderObject.Id; orderProductBurden.TenantId = orderObject.TenantId; orderProductBurden.TradeNo = orderObject.TradeNo; orderProductBurden.BurdenProductId = makeBurden.BurdenProductId; orderProductBurden.BurdenSpecId = makeBurden.BurdenSpecId; orderProductBurden.SalesUnitId = makeBurden.SalesUnitId; orderProductBurden.SalesAmount = makeBurden.SalesAmount * (flavorItem.Quantity - flavorItem.RefundQuantity); orderBurdenList.Add(orderProductBurden); } } } } //第二部合并耗料数量 if (orderBurdenList != null && orderBurdenList.Count > 0) { List temList = orderBurdenList.OrderBy(x => x.BurdenSpecId).ToList(); Dictionary typeMap = new Dictionary(); string burdenProductId_temp = ""; string burdenSpecId_temp = ""; string salesUnitId_temp = ""; int i = 0; List> result = new List>(); decimal salesAmount = 0.00M; int listLength = temList.Count; foreach (OrderProductBurden orderProductBurden in temList) { string burdenSpecId = orderProductBurden.BurdenSpecId; if (!burdenSpecId_temp.Equals(burdenSpecId)) { if (i != 0) { typeMap.Add("orderId", orderProductBurden.OrderId); typeMap.Add("tenantId", orderProductBurden.TenantId); typeMap.Add("tradeNo", orderProductBurden.TradeNo); typeMap.Add("burdenProductId", burdenProductId_temp); typeMap.Add("burdenSpecId", burdenSpecId_temp); typeMap.Add("salesUnitId", salesUnitId_temp); typeMap.Add("salesAmount", salesAmount); result.Add(typeMap); //分类改变时,清除缓存 typeMap = new Dictionary(); } salesAmount = 0.00M; burdenProductId_temp = orderProductBurden.BurdenProductId; burdenSpecId_temp = orderProductBurden.BurdenSpecId; salesUnitId_temp = orderProductBurden.SalesUnitId; } salesAmount = salesAmount + orderProductBurden.SalesAmount; i = i + 1; if (i == listLength) { typeMap.Add("orderId", orderProductBurden.OrderId); typeMap.Add("tenantId", orderProductBurden.TenantId); typeMap.Add("tradeNo", orderProductBurden.TradeNo); typeMap.Add("burdenProductId", burdenProductId_temp); typeMap.Add("burdenSpecId", burdenSpecId_temp); typeMap.Add("salesUnitId", salesUnitId_temp); typeMap.Add("salesAmount", salesAmount); result.Add(typeMap); //分类改变时,清除缓存 typeMap = new Dictionary(); } } List list = new List(); foreach (Dictionary map in result) { OrderProductBurden entity = new OrderProductBurden(); entity.Id = IdWorkerUtils.Instance.NextId(); entity.StoreId = orderObject.StoreId; entity.OrderId = StringUtils.GetString(map["orderId"]); entity.TenantId = StringUtils.GetString(map["tenantId"]); entity.TradeNo = StringUtils.GetString(map["tradeNo"]); entity.BurdenProductId = StringUtils.GetString(map["burdenProductId"]); entity.BurdenSpecId = StringUtils.GetString(map["burdenSpecId"]); entity.SalesUnitId = StringUtils.GetString(map["salesUnitId"]); entity.SalesAmount = StringUtils.GetDecimal(map["salesAmount"]); list.Add(entity); } db.InsertBatch(list); } //更新是否有订单需要上传的状态 LOGGER.Info("有需要上传的营业数据,isHaveUpLoadTicket = true"); Global.isHaveUpLoadTicket = true; Global.isHaveBurdenTicket = true; LOGGER.Info("有需要同步到服务中心的订单,isHaveCenterTicket = true"); Global.isHaveCenterTicket = true; trans.Complete(); } } Thread.Sleep(100); } LOGGER.Info("饿了么存储本地订单"); } this.ShowToastNotify(this, "补单成功"); } catch (Exception ex) { LOGGER.Error(ex, "饿了么补单异常"); this.ShowToastNotify(this, "饿了么补单异常"); } } else { this.ShowToastNotify(this, "本地订单已存在不需要补单"); } isBudanFlag = false; } /// /// 订单拒绝退单 /// /// /// private void Item_OnRefundReject(object sender, EleMeOrderEventArgs e) { var button = sender as ButtonX; try { button.Enabled = false; string orderId = e.OrderId; EleMeOrderRefundDisagreeRequest request = new EleMeOrderRefundDisagreeRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; request.Reason = "您点的餐已做好"; var response = OtherWaiMaiUtils.EleMeOrderRefundDisagree(request); if (response != null) { LOGGER.Info("饿了么订单拒绝退单:" + response.Item2); this.ShowToastNotify(this, response.Item2); if (response.Item1) { switch (SelectType) { case 0: DoHandQuery(); break; case 1: DoQuery(1, pagerControl2.RowsPerPage); break; } } } } finally { button.Enabled = true; } } /// /// 订单接受退单 /// /// /// private void Item_OnRefundAgree(object sender, EleMeOrderEventArgs e) { var button = sender as ButtonX; try { button.Enabled = false; string orderId = e.OrderId; EleMeOrderRefundAgreeRequest request = new EleMeOrderRefundAgreeRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; var response = OtherWaiMaiUtils.EleMeOrderRefundAgree(request); if (response != null) { LOGGER.Info("饿了么订单同意退单:" + response.Item2); this.ShowToastNotify(this, response.Item2); if (response.Item1) { //退单业务处理,退单处理退本地单 this.DoRefund("5" + orderId); switch (SelectType) { case 0: DoHandQuery(); break; case 1: DoQuery(1, pagerControl2.RowsPerPage); break; } } } } finally { button.Enabled = true; } } private Tuple DoRefund(string tradeNo) { try { OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo(tradeNo); if (_OrderObject != null) { if (_OrderObject.OrgTradeNo != null && !"".Equals(_OrderObject.OrgTradeNo)) { return new Tuple(false, "订单已完全退单"); } //生成新单 OrderObject _BackOrderObject = ObjectUtils.Copy(_OrderObject); string finishDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //=========更新原单内容 //录入原单号 _BackOrderObject.Id = IdWorkerUtils.Instance.NextId(); //操作员工号 _BackOrderObject.WorkerNo = Global.Instance.Worker.No; //操作员名称 _BackOrderObject.WorkerName = Global.Instance.Worker.Name; _BackOrderObject.SaleDate = finishDate; //班次名称 _BackOrderObject.ShiftName = Global.Instance.BusinessPlanLog.Name; //班次编号 _BackOrderObject.ShiftNo = Global.Instance.BusinessPlanLog.No; //订单标识为 新建状态 _BackOrderObject.OrderStatus = OrderStatus.已退单; //订单创建时间 _BackOrderObject.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //订单创建人 _BackOrderObject.CreateUser = Global.Instance.Worker.Name; string[] day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; string weeker = day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"))].ToString(); //星期 _BackOrderObject.Weeker = weeker; //天气 _BackOrderObject.Weather = string.Empty; _BackOrderObject.ObjectId = ObjectId.GenerateNewStringId(); _BackOrderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo(); _BackOrderObject.FinishDate = finishDate; _BackOrderObject.Amount = 0 - _OrderObject.Amount; _BackOrderObject.DiscountAmount = 0 - _OrderObject.DiscountAmount; _BackOrderObject.ReceivableAmount = 0 - _OrderObject.ReceivableAmount; _BackOrderObject.PaidAmount = 0 - _OrderObject.PaidAmount; _BackOrderObject.ReceivedAmount = 0 - _OrderObject.ReceivedAmount; _BackOrderObject.MalingAmount = 0 - _OrderObject.MalingAmount; _BackOrderObject.ChangeAmount = 0 - _OrderObject.ChangeAmount; _BackOrderObject.InvoicedAmount = 0 - _OrderObject.InvoicedAmount; _BackOrderObject.SyncStatus = 0; _BackOrderObject.PrintStatus = 0; _BackOrderObject.AddPoint = 0 - _OrderObject.AddPoint; _BackOrderObject.UploadStatus = 0; _BackOrderObject.UploadMessage = ""; _BackOrderObject.TicketId = ""; _BackOrderObject.OrgTradeNo = _OrderObject.TradeNo; //整单优惠 foreach (PromotionOrder promotion in _BackOrderObject.Promotions) { promotion.Id = IdWorkerUtils.Instance.NextId(); promotion.OrderId = _BackOrderObject.Id; promotion.TradeNo = _BackOrderObject.TradeNo; promotion.Amount = 0 - promotion.Amount; promotion.DiscountAmount = 0 - promotion.DiscountAmount; promotion.ReceivableAmount = 0 - promotion.ReceivableAmount; promotion.FinishDate = finishDate; } //====== 更新明细内容 foreach (OrderItem item in _BackOrderObject.Items) { item.Id = IdWorkerUtils.Instance.NextId(); item.OrderId = _BackOrderObject.Id; item.TradeNo = _BackOrderObject.TradeNo; //单品优惠 foreach (PromotionItem promotion in item.Promotions) { promotion.Id = IdWorkerUtils.Instance.NextId(); promotion.OrderId = _BackOrderObject.Id; promotion.ItemId = item.Id; promotion.TradeNo = _BackOrderObject.TradeNo; promotion.Amount = 0 - promotion.Amount; promotion.DiscountAmount = 0 - promotion.DiscountAmount; promotion.ReceivableAmount = 0 - promotion.ReceivableAmount; promotion.FinishDate = finishDate; } //做法信息 foreach (FlavorItem flavor in item.Flavors) { flavor.Id = IdWorkerUtils.Instance.NextId(); flavor.OrderId = _BackOrderObject.Id; flavor.ItemId = item.Id; flavor.TradeNo = _BackOrderObject.TradeNo; flavor.RefundQuantity = flavor.Quantity; flavor.Amount = 0 - flavor.Amount; flavor.Quantity = 0; flavor.DiscountAmount = 0 - flavor.DiscountAmount; flavor.FinishDate = finishDate; flavor.isBackTicket = true; flavor.isWaiMaiTicket = true; } item.RefundQuantity = item.Quantity; item.Quantity = 0; item.Amount = 0 - item.Amount; item.FlavorAmount = 0 - item.FlavorAmount; item.FlavorDiscountAmount = 0 - item.FlavorDiscountAmount; item.FlavorReceivableAmount = 0 - item.FlavorReceivableAmount; item.TotalAmonut = 0 - item.TotalAmonut; item.SuitAddPrice = 0 - item.SuitAddPrice; item.SuitAmount = 0 - item.SuitAmount; item.SaleDate = finishDate; item.ChudaQty = 0; item.ChupinQty = 0; item.ChuxianQty = 0; item.KdsChupinQty = 0; item.FinishDate = finishDate; } //支付方式遍历 foreach (PayItem pay in _BackOrderObject.Pays) { pay.Id = IdWorkerUtils.Instance.NextId(); pay.TradeNo = _BackOrderObject.TradeNo; pay.PayNo = OrderUtils.Instance.GeneratePayNo(); pay.OrderId = _BackOrderObject.Id; pay.Amount = 0 - pay.Amount; pay.PaidAmount = 0 - pay.PaidAmount; pay.ChangeAmount = 0 - pay.ChangeAmount; pay.PayTime = finishDate; pay.FinishDate = finishDate; pay.OverAmount = 0 - pay.OverAmount; pay.ShiftName = _BackOrderObject.ShiftName; pay.ShiftNo = _BackOrderObject.ShiftNo; } var isException = OrderUtils.Instance.SaveOrderObject(_BackOrderObject); if (!isException) { _OrderObject.OrgTradeNo = _BackOrderObject.TradeNo; using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { db.Update(_OrderObject); trans.Complete(); } } //LOGGER.Info("开始打印"); //this.ShowToastNotify(this, "正在打印退款单..."); //开始打印 //_BackOrderObject.PrintType = 1; //_BackOrderObject.RPrint = false; //this.PrintOrderObject(_BackOrderObject, true); return new Tuple(true, "退单完成"); } else { return new Tuple(false, "退单保存失败!"); } } else { return new Tuple(false, "获取订单信息异常"); } } catch (Exception ex) { LOGGER.Error(ex, "退单发生异常"); return new Tuple(false, "退单发生异常"); } } /// /// 订单取消 /// /// /// private void Item_OnCancel(object sender, EleMeOrderEventArgs e) { var button = sender as ButtonX; try { button.Enabled = false; string orderId = e.OrderId; EleMeOrderCancelRequest request = new EleMeOrderCancelRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; request.Type = 5; request.Remark = "对不起,商品已经售完"; var response = OtherWaiMaiUtils.EleMeOrderCancel(request); if (response != null) { LOGGER.Info("饿了么订单取消:" + response.Item2); this.ShowToastNotify(this, response.Item2); if (response.Item1) { switch (SelectType) { case 0: DoHandQuery(); break; case 1: DoQuery(1, pagerControl2.RowsPerPage); break; } } } } finally { button.Enabled = true; } } /// /// 订单接单 /// /// /// private void Item_OnConfirm(object sender, EleMeOrderEventArgs e) { var button = sender as ButtonX; try { button.Enabled = false; string orderId = e.OrderId; LOGGER.Info("饿了么手动接单"); OrderOnConfirm(orderId); } finally { button.Enabled = true; } } public void OrderOnConfirm(string orderId) { EleMeOrderConfirmRequest request = new EleMeOrderConfirmRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; var response = OtherWaiMaiUtils.EleMeOrderConfirm(request); if (response != null) { LOGGER.Info("饿了么订单接单:" + response.Item2); this.ShowToastNotify(this, response.Item2); if (response.Item1) { //接单成功打印订单 try { EleMeOrderRequest request1 = new EleMeOrderRequest(); string orderDate = this.dateInputPicker.Text; request1.StoreId = Global.Instance.BusinessPlanLog.StoreId; request1.OrderId = orderId; var response1 = OtherWaiMaiUtils.EleMeOrder(request1); if (response1 != null && response1.Item1) { OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo("5" + orderId); if (_OrderObject !=null) { LOGGER.Info("饿了么订单已存在"); return; } //组装本地数据 OrderObject orderObject = OtherWaiMaiApi.getOrderLocalEleme(response1.Item3.Data); LOGGER.Info("饿了么组装本地订单"); lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { //遍历获取成本价 foreach (OrderItem item in orderObject.Items) { ProductSpec productSpec = Global.ProductSpec._productSpecList.Find(x => x.Id.Equals(item.SpecId) && x.ProductId.Equals(item.ProductId)); if (productSpec != null) { item.CostPrice = productSpec.CostPrice; } else { item.CostPrice = 0.00M; } } //整单 db.Insert(orderObject); //单品明细 db.InsertBatch(orderObject.Items); if (orderObject.Items != null) { //单品优惠 foreach (var promotion in orderObject.Items) { if (promotion.Promotions != null && promotion.Promotions.Count > 0) { db.InsertBatch(promotion.Promotions); } } } //添加支付汇总的必填字段 foreach (PayItem payItem in orderObject.Pays) { var payMode = OrderUtils.GetPayMode(payItem.No); if (payMode == null) { payItem.IncomeFlag = 1; payItem.OtherRateType = 0; payItem.OtherRateValue = 0.00M; } else { payItem.IncomeFlag = payMode.IncomeFlag; payItem.OtherRateType = payMode.OtherRateType; payItem.OtherRateValue = payMode.OtherRateValue; } } //支付明细 db.InsertBatch(orderObject.Pays); //做法明细 foreach (var flavor in orderObject.Items) { if (flavor.Flavors.Count > 0) { db.InsertBatch(flavor.Flavors); } } //8、保存耗料信息 List orderBurdenList = new List(); //第一步组装耗料数量 foreach (var item in orderObject.Items) { //第一步先看看商品是否是管理库存的直销品 var lists = Global.Product._productList; var selectProduct = new List(); selectProduct = lists.FindAll(x => x.Id.Equals(item.ProductId)); if (selectProduct != null && selectProduct.Count > 0) { ProductExt productExt = selectProduct[0]; if (productExt.StockFlag == 1) { OrderProductBurden orderProductBurden = new OrderProductBurden(); orderProductBurden.OrderId = orderObject.Id; orderProductBurden.TenantId = orderObject.TenantId; orderProductBurden.TradeNo = orderObject.TradeNo; orderProductBurden.BurdenProductId = item.ProductId; orderProductBurden.BurdenSpecId = item.SpecId; orderProductBurden.SalesUnitId = item.ProductUnitId; orderProductBurden.SalesAmount = item.Quantity - item.RefundQuantity; orderBurdenList.Add(orderProductBurden); } } //第二步获取门店耗料 StringBuilder sqlBuf = new StringBuilder(); sqlBuf.Append("select burdenProductId,burdenSpecId,salesUnitId,salesAmount from pos_product_burden where productId='{0}' and specId='{1}'"); string productBurdenSql = string.Format(sqlBuf.ToString(), item.ProductId, item.SpecId); List productBurdenList = db.Query(productBurdenSql).ToList(); if (productBurdenList != null && productBurdenList.Count > 0) { foreach (ProductBurden productBurden in productBurdenList) { OrderProductBurden orderProductBurden = new OrderProductBurden(); orderProductBurden.OrderId = orderObject.Id; orderProductBurden.TenantId = orderObject.TenantId; orderProductBurden.TradeNo = orderObject.TradeNo; orderProductBurden.BurdenProductId = productBurden.BurdenProductId; orderProductBurden.BurdenSpecId = productBurden.BurdenSpecId; orderProductBurden.SalesUnitId = productBurden.SalesUnitId; orderProductBurden.SalesAmount = productBurden.SalesAmount * (item.Quantity - item.RefundQuantity); orderBurdenList.Add(orderProductBurden); } } //做法耗料 foreach (var flavorItem in item.Flavors) { StringBuilder sqlBuf1 = new StringBuilder(); sqlBuf1.Append("select burdenProductId,burdenSpecId,salesUnitId,salesAmount from pos_make_burden where makeId='{0}'"); string makeBurdenSql = string.Format(sqlBuf1.ToString(), flavorItem.MakeId); List makeBurdenList = db.Query(makeBurdenSql).ToList(); if (makeBurdenList != null && makeBurdenList.Count > 0) { foreach (MakeBurden makeBurden in makeBurdenList) { OrderProductBurden orderProductBurden = new OrderProductBurden(); orderProductBurden.OrderId = orderObject.Id; orderProductBurden.TenantId = orderObject.TenantId; orderProductBurden.TradeNo = orderObject.TradeNo; orderProductBurden.BurdenProductId = makeBurden.BurdenProductId; orderProductBurden.BurdenSpecId = makeBurden.BurdenSpecId; orderProductBurden.SalesUnitId = makeBurden.SalesUnitId; orderProductBurden.SalesAmount = makeBurden.SalesAmount * (flavorItem.Quantity - flavorItem.RefundQuantity); orderBurdenList.Add(orderProductBurden); } } } } //第二部合并耗料数量 if (orderBurdenList != null && orderBurdenList.Count > 0) { List temList = orderBurdenList.OrderBy(x => x.BurdenSpecId).ToList(); Dictionary typeMap = new Dictionary(); string burdenProductId_temp = ""; string burdenSpecId_temp = ""; string salesUnitId_temp = ""; int i = 0; List> result = new List>(); decimal salesAmount = 0.00M; int listLength = temList.Count; foreach (OrderProductBurden orderProductBurden in temList) { string burdenSpecId = orderProductBurden.BurdenSpecId; if (!burdenSpecId_temp.Equals(burdenSpecId)) { if (i != 0) { typeMap.Add("orderId", orderProductBurden.OrderId); typeMap.Add("tenantId", orderProductBurden.TenantId); typeMap.Add("tradeNo", orderProductBurden.TradeNo); typeMap.Add("burdenProductId", burdenProductId_temp); typeMap.Add("burdenSpecId", burdenSpecId_temp); typeMap.Add("salesUnitId", salesUnitId_temp); typeMap.Add("salesAmount", salesAmount); result.Add(typeMap); //分类改变时,清除缓存 typeMap = new Dictionary(); } salesAmount = 0.00M; burdenProductId_temp = orderProductBurden.BurdenProductId; burdenSpecId_temp = orderProductBurden.BurdenSpecId; salesUnitId_temp = orderProductBurden.SalesUnitId; } salesAmount = salesAmount + orderProductBurden.SalesAmount; i = i + 1; if (i == listLength) { typeMap.Add("orderId", orderProductBurden.OrderId); typeMap.Add("tenantId", orderProductBurden.TenantId); typeMap.Add("tradeNo", orderProductBurden.TradeNo); typeMap.Add("burdenProductId", burdenProductId_temp); typeMap.Add("burdenSpecId", burdenSpecId_temp); typeMap.Add("salesUnitId", salesUnitId_temp); typeMap.Add("salesAmount", salesAmount); result.Add(typeMap); //分类改变时,清除缓存 typeMap = new Dictionary(); } } List list = new List(); foreach (Dictionary map in result) { OrderProductBurden entity = new OrderProductBurden(); entity.Id = IdWorkerUtils.Instance.NextId(); entity.StoreId = orderObject.StoreId; entity.OrderId = StringUtils.GetString(map["orderId"]); entity.TenantId = StringUtils.GetString(map["tenantId"]); entity.TradeNo = StringUtils.GetString(map["tradeNo"]); entity.BurdenProductId = StringUtils.GetString(map["burdenProductId"]); entity.BurdenSpecId = StringUtils.GetString(map["burdenSpecId"]); entity.SalesUnitId = StringUtils.GetString(map["salesUnitId"]); entity.SalesAmount = StringUtils.GetDecimal(map["salesAmount"]); list.Add(entity); } db.InsertBatch(list); } //更新是否有订单需要上传的状态 LOGGER.Info("有需要上传的营业数据,isHaveUpLoadTicket = true"); Global.isHaveUpLoadTicket = true; Global.isHaveBurdenTicket = true; LOGGER.Info("有需要同步到服务中心的订单,isHaveCenterTicket = true"); Global.isHaveCenterTicket = true; trans.Complete(); } } Thread.Sleep(100); } LOGGER.Info("饿了么存储本地订单"); Task.Factory.StartNew(() => { this.ShowToastNotify(this, "开始打印"); LOGGER.Info("饿了么接单打印"); //构建收银小票模版参数打印 var vars = WaiMaiHelper.BuilderEleMeVariable(response1.Item3.Data.ShopName, response1.Item3.Data, false); Tuple result = WaiMaiHelper.PrinterTicket("饿了么", vars); this.ShowToastNotify(this, string.Format("{0}", result.Item2)); //打印标签 LOGGER.Info("饿了么标签打印"); LabelPrintHelper.PrintOrderLabel(orderObject); //执行厨打标签 ChuDaHelper.KitchenLabelPrinter(orderObject); LOGGER.Info("饿了么执行厨打标签"); //启用外卖商品绑定厨显方案 var planKds = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_OTHERWAIMAI_PLANKDS, true); //启用外卖商品绑定厨打方案 var planKit = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_OTHERWAIMAI_PLANKIT, true); if (planKit) { //执行厨打 ChuDaHelper.KitchenPrinter(orderObject); logger.Info("饿了么厨打成功"); //执行出品 ChuDaHelper.MadePrinter(orderObject); logger.Info("饿了么出品成功"); } if (planKds) { //通知厨显 UploadSCNewOrder.UploadNewOrder2SC4KDS(orderObject); logger.Info("饿了么厨显成功"); } }); } } catch (Exception ex) { LOGGER.Error(ex, "饿了么接单异常"); } switch (SelectType) { case 0: DoHandQuery(); break; case 1: DoQuery(1, pagerControl2.RowsPerPage); break; } } } } /// /// 门店开业 /// /// /// private void btn_openStore(object sender, EventArgs e) { EleMePoiUpdateRequest request = new EleMePoiUpdateRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.IsOpen = 1; var response = OtherWaiMaiUtils.EleMePoiUpdate(request); if (response != null) { this.ShowToastNotify(this, response.Item2); if (response.Item1) { QueryMeiTuanPoiInfo(); } } } /// /// 门店歇业 /// /// /// private void btn_closeStore(object sender, EventArgs e) { EleMePoiUpdateRequest request = new EleMePoiUpdateRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.IsOpen = 0; var response = OtherWaiMaiUtils.EleMePoiUpdate(request); if (response != null) { this.ShowToastNotify(this, response.Item2); if (response.Item1) { QueryMeiTuanPoiInfo(); } } } /// /// 门店门店信息 /// private void QueryMeiTuanPoiInfo() { Task.Factory.StartNew(() => { EleMeShopInfoRequest request = new EleMeShopInfoRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.EleMeShopInfo(request); if (response != null && response.Item1) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { var responseMessage = response.Item3; if (responseMessage != null && responseMessage.Data != null) { EleMeShopInfoResponse PoiInfo = responseMessage.Data; this.StoreNameLabelX.Text = PoiInfo.Name;//门店名称 switch (PoiInfo.IsOpen) { case 0: this.isOpenLabelX.Text = "门店休息"; break; case 1: this.isOpenLabelX.Text = "正在营业"; break; default: this.isOpenLabelX.Text = "门店休息"; break; } this.openTimeLabelX.Text = StringUtils.GetString(PoiInfo.ServingTime).Replace("[","").Replace("]","").Replace("\"","").Trim() ; } })); } }); } private void btn_getHandOrder(object sender, EventArgs e) { var obj = sender as ButtonX; try { obj.Enabled = false; DoHandQuery(); } finally { obj.Enabled = true; } } /// /// 待处理订单和历史订单查询切换 /// /// /// private void tab_onclick(object sender, EventArgs e) { var obj = sender as SuperTabItem; var name = obj.Tag as string; switch (name) { case "superTabItem1"://待处理订单 SelectType = 0; break; case "superTabItem2"://历史订单 SelectType = 1; break; } } /// /// 获取待处理订单 /// private void DoHandQuery() { if (handleQuerying) { this.ShowToastNotify(this, "查询中....."); return; } handleQuerying = true; this.tableLayoutPanel1.Controls.Clear(); Task.Factory.StartNew(() => { EleMeOrderHandleRequest request = new EleMeOrderHandleRequest(); string orderDate = this.dateInputPicker.Text; request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.QueryEleMeOrderHandle(request); if (response != null && response.Item1) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { List detailList = new List(); foreach (EleMeOrderHandleResponse order in response.Item3.List) { var item = new EleMeItem(order); item.OnConfirm += Item_OnConfirm; item.OnCancel += Item_OnCancel; item.OnRefundAgree += Item_OnRefundAgree; item.OnRefundReject += Item_OnRefundReject; item.OnOrderPrint += Item_OnPrint; item.OnOrderBuDan += Item_OnBuDan; detailList.Add(item); } if (this.IsDisposed || !this.IsHandleCreated) return; if (detailList.Count > 0) { this.tableLayoutPanel1.Controls.AddRange(detailList.ToArray()); //滚动至顶部 this.tableLayoutPanel1.AutoScrollPosition = new Point(0, 0); } //更新控件 sendNewView(response.Item3.List.Count); })); } handleQuerying = false; }); } /// /// 是否自动接单 /// /// /// private void cb_change_click(object sender, EventArgs e) { var obj = sender as CheckBoxX; var indexT = obj.Tag as string; int type = 0; if ("开启".Equals(indexT) && obj.Checked) { ConfirmType = 1; } if ("关闭".Equals(indexT) && obj.Checked) { ConfirmType = 0; } var config = new Config(); config.Id = IdWorkerUtils.Instance.NextId(); config.Group = ConfigConstant.DEVICE_GROUP; config.TenantId = Global.Instance.Authc.TenantId; config.Keys = ConfigConstant.ELEME_CONFIRM_PARAMETER; config.Values = string.Format("{0}", ConfirmType); try { using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { db.Save(config); trans.Complete(); } } Global.Instance.ReloadConfig(ConfigConstant.DEVICE_GROUP); if (ConfirmType == 1) { this.ShowToastNotify(this, "开启自动接单"); } else { this.ShowToastNotify(this, "关闭自动接单"); } } catch (Exception ex) { string message = "美团外卖参数更新异常"; LOGGER.Error(ex, message); } } //根据待处理订单的数量刷新提示 public void sendNewView(int orderCount) { //有百度外卖订单 MsgEvent.Send(Constant.MSGCENTER_NOTIFY, new MsgEntity() { Subject = Constant.MENU_TITLE_CHANGED_NOTIFY, SubSubject = ModuleKeyCode.饿了么.ToString(), Operate = MsgEntityOperate.发布, Data = new Tuple(ModuleKeyCode.饿了么, MenuTileNotifyType.数量, string.Format("{0}", orderCount)) }); } private void btn_time_Click(object sender, EventArgs e) { var obj = sender as ButtonX; try { obj.Enabled = false; var date = obj.Tag as string; switch (date) { case "today": this.dateInputPicker.Value = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")); break; case "yesterday": this.dateInputPicker.Value = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); break; } DoQuery(1, pagerControl2.RowsPerPage); } finally { obj.Enabled = true; } } private void cbstatus_change_click(object sender, EventArgs e) { var obj = sender as CheckBoxX; var indexT = obj.Tag as string; if ("全部".Equals(indexT)) { orderType = 0; } if ("已取消".Equals(indexT)) { orderType = 1; } if ("已退单".Equals(indexT)) { orderType = 2; } DoQuery(1, pagerControl2.RowsPerPage); } private void OnQueryPageChangeWithObject(object obj) { //获得当前页 int cur = pagerControl2.CurrentPage; //获得每页显示的记录数 int rows = pagerControl2.RowsPerPage; PagerControl pager = obj as PagerControl; if (pager != null) { DoQuery(cur, rows); } } private void btn_bindStore(object sender, EventArgs e) { try { EleMeStoreSaveRequest request = new EleMeStoreSaveRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.EleMeStoreSave(request); //成功 if (response.Item1) { EleMeAuthorizeUrlRequest request1 = new EleMeAuthorizeUrlRequest(); request1.AppSign = "cy2"; request1.No = response.Item3.Data.No; var response1 = OtherWaiMaiUtils.EleMeAuthorizeUrl(request1); //成功 if (response1.Item1) { this.ShowToastNotify(this, response1.Item2); //打开二维码生成界面 var form = new WaiMaiBindForm(response1.Item3.Data.Url); form.ShowDialog(); } else { this.ShowToastNotify(this, response1.Item2); } } else { this.ShowToastNotify(this, response.Item2); } } catch (Exception ex) { this.ShowToastNotify(this, "饿了么绑定链接生成失败!"); LOGGER.Error(ex, "饿了么绑定链接生成失败"); } } private void btn_unbindStore(object sender, EventArgs e) { try { EleMeStoreUnbindRequest request = new EleMeStoreUnbindRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.EleMeStoreUnbind(request); //成功 if (response.Item1) { this.ShowToastNotify(this, response.Item2); } else { this.ShowToastNotify(this, response.Item2); } } catch (Exception ex) { this.ShowToastNotify(this, "饿了么解绑失败!"); LOGGER.Error(ex, "饿了么解绑失败"); } } } }