using DevComponents.DotNetBar; using DevComponents.DotNetBar.Controls; using NLog; 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 MeituanForm : 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 MeituanForm() { InitializeComponent(); this.dateInputPicker.Value = DateTime.Now.Date; //是否开启自动接单 bool openConfirm = Global.Instance.GlobalConfigBoolValue(ConfigConstant.MEITUAN_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); this.checkBoxX0.Checked = true; //第一步加载门店信息 QueryMeiTuanPoiInfo(); //第二步,获取待处理订单 Proxy.Mqtt.MqttClientUtils.Instance.OnMessageReceived -= Instance_OnMessageReceived; 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("meituan") && !"".Equals(messageMap["meituan"])) { 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 QueryMeiTuanPoiInfo() { Task.Factory.StartNew(() => { MeiTuanPoiInfoRequest request = new MeiTuanPoiInfoRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.MeiTuanPoiInfo(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) { MeiTuanPoiInfoResponse PoiInfo = responseMessage.Data; this.StoreNameLabelX.Text = PoiInfo.Name;//门店名称 switch (PoiInfo.IsOpen) { case 0: this.isOpenLabelX.Text = "未上线"; break; case 1: this.isOpenLabelX.Text = "可配送"; break; case 3: this.isOpenLabelX.Text = "休息中"; break; default: this.isOpenLabelX.Text = "未营业"; break; } this.openTimeLabelX.Text = PoiInfo.OpenTime; } })); } }); } 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(() => { MeiTuanOrderListRequest request = new MeiTuanOrderListRequest(); 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.QueryMeiTuanOrder(request); if (response != null && response.Item1) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { List detailList = new List(); int handCount = 0; foreach (MeiTuanOrderListResponse order in response.Item3.List) { if (order.Status == 1 || order.Status == 2 || order.Status == 3) { handCount = handCount + 1; } var item = new MeiTuanItem(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, MeiTuanOrderEventArgs e) { Task.Factory.StartNew(() => { try { string orderId = e.OrderId; MeiTuanOrderRequest request = new MeiTuanOrderRequest(); string orderDate = this.dateInputPicker.Text; request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; var response = OtherWaiMaiUtils.MeiTuanOrder(request); if (response != null && response.Item1) { this.ShowToastNotify(this, "开始打印"); //构建收银小票模版参数 var vars = WaiMaiHelper.BuilderMeiTuanVariable(response.Item3.Data.PoiName, response.Item3.Data, true); Tuple result = WaiMaiHelper.PrinterTicket("美团外卖", vars); this.ShowToastNotify(this, string.Format("{0}", result.Item2)); //组装本地数据 OrderObject orderObject = OtherWaiMaiApi.getOrderLocalMeiTuan(response.Item3.Data); //打印标签 LabelPrintHelper.PrintOrderLabel(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("美团外卖厨显成功"); } } } catch (Exception ex) { logger.Info("外卖订单打印异常:" + ex.Message); } }); } /// /// 订单拒绝退单 /// /// /// private void Item_OnRefundReject(object sender, MeiTuanOrderEventArgs e) { string orderId = e.OrderId; MeiTuanOrderRefundDisagreeRequest request = new MeiTuanOrderRefundDisagreeRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; request.Reason = "您订购的饭菜已出餐,不能退款"; var response = OtherWaiMaiUtils.MeiTuanOrderRefundReject(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; } } } } /// /// 订单接受退单 /// /// /// private void Item_OnRefundAgree(object sender, MeiTuanOrderEventArgs e) { string orderId = e.OrderId; MeiTuanOrderRefundAgreeRequest request = new MeiTuanOrderRefundAgreeRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; request.Reason = "已同意退款请求,谢谢您的光临"; var response = OtherWaiMaiUtils.MeiTuanOrderRefundAgree(request); if (response != null) { LOGGER.Info("美团外卖订单同意退单:" + response.Item2); this.ShowToastNotify(this, response.Item2); if (response.Item1) { //退单业务处理,退单处理退本地单 this.DoRefund("4" + orderId); switch (SelectType) { case 0: DoHandQuery(); break; case 1: DoQuery(1, pagerControl2.RowsPerPage); break; } } } } 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 = _BackOrderObject.OrderType.ToString() + 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, MeiTuanOrderEventArgs e) { string orderId = e.OrderId; MeiTuanOrderCancelRequest request = new MeiTuanOrderCancelRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; request.ReasonCode = "2007"; request.Reason = "对不起暂时无法提供服务"; var response = OtherWaiMaiUtils.MeiTuanOrderCancel(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; } } } } /// /// 订单接单 /// /// /// private void Item_OnConfirm(object sender, MeiTuanOrderEventArgs e) { LOGGER.Info("美团外卖手动接单"); string orderId = e.OrderId; OrderOnConfirm(orderId); } /// /// 订单补单 /// /// /// private void Item_OnBuDan(object sender, MeiTuanOrderEventArgs e) { if (isBudanFlag) { return; } isBudanFlag = true; string orderId = e.OrderId; OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo("4" + orderId); //判断订单是否存在 if (_OrderObject == null) { try { //接单成功打印订单 MeiTuanOrderRequest request1 = new MeiTuanOrderRequest(); string orderDate = this.dateInputPicker.Text; request1.StoreId = Global.Instance.BusinessPlanLog.StoreId; request1.OrderId = orderId; var response1 = OtherWaiMaiUtils.MeiTuanOrder(request1); if (response1 != null && response1.Item1) { //组装本地数据 LOGGER.Info("美团外卖订单组装本地数据"); OrderObject orderObject = OtherWaiMaiApi.getOrderLocalMeiTuan(response1.Item3.Data); 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; } public void OrderOnConfirm(string orderId) { MeiTuanOrderConfirmRequest request = new MeiTuanOrderConfirmRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OrderId = orderId; var response = OtherWaiMaiUtils.MeiTuanOrderConfirm(request); if (response != null) { LOGGER.Info("美团外卖订单接单:" + response.Item2); this.ShowToastNotify(this, response.Item2); if (response.Item1) { try { //接单成功打印订单 MeiTuanOrderRequest request1 = new MeiTuanOrderRequest(); string orderDate = this.dateInputPicker.Text; request1.StoreId = Global.Instance.BusinessPlanLog.StoreId; request1.OrderId = orderId; var response1 = OtherWaiMaiUtils.MeiTuanOrder(request1); if (response1 != null && response1.Item1) { OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo("4" + orderId); if (_OrderObject != null) { LOGGER.Info("美团外卖订单已存在"); return; } //组装本地数据 LOGGER.Info("美团外卖订单组装本地数据"); OrderObject orderObject = OtherWaiMaiApi.getOrderLocalMeiTuan(response1.Item3.Data); 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("美团外卖订单存储本地数据"); Task.Factory.StartNew(() => { LOGGER.Info("美团外卖订单打印"); this.ShowToastNotify(this, "开始打印"); //构建收银小票模版参数打印 var vars = WaiMaiHelper.BuilderMeiTuanVariable(response1.Item3.Data.PoiName, 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) { MeiTuanPoiOpenRequest request = new MeiTuanPoiOpenRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.MeiTuanPoiOpen(request); if (response != null) { if (response.Item1) { this.ShowToastNotify(this, response.Item2); QueryMeiTuanPoiInfo(); } } } /// /// 门店休息 /// /// /// private void btn_closeStore(object sender, EventArgs e) { MeiTuanPoiCloseRequest request = new MeiTuanPoiCloseRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.MeiTuanPoiClose(request); if (response != null) { if (response.Item1) { this.ShowToastNotify(this, response.Item2); QueryMeiTuanPoiInfo(); } } } private void btn_getHandOrder(object sender, EventArgs e) { DoHandQuery(); } /// /// 获取待处理订单 /// private void DoHandQuery() { if (handleQuerying) { this.ShowToastNotify(this, "查询中....."); return; } handleQuerying = true; this.tableLayoutPanel1.Controls.Clear(); Task.Factory.StartNew(() => { MeiTuanOrderHandleRequest request = new MeiTuanOrderHandleRequest(); string orderDate = this.dateInputPicker.Text; request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.QueryMeiTuanOrderHandle(request); if (response != null && response.Item1) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { List detailList = new List(); foreach (MeiTuanOrderHandleResponse order in response.Item3.List) { var item = new MeiTuanItem(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 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 OnQueryPageChangeWithObject(object obj) { //获得当前页 int cur = pagerControl2.CurrentPage; //获得每页显示的记录数 int rows = pagerControl2.RowsPerPage; PagerControl pager = obj as PagerControl; if (pager != null) { DoQuery(cur, rows); } } /// /// 是否自动接单 /// /// /// 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.MEITUAN_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 miniToolStrip_RefreshItems(object sender, EventArgs e) { } /// /// 美团绑定 /// /// /// private void btn_bindStore(object sender, EventArgs e) { try { MeiTuanStoreSaveRequest request = new MeiTuanStoreSaveRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = OtherWaiMaiUtils.MeiTuanStoreSave(request); //成功 if (response.Item1) { MeiTuanStoreMapUrlRequest request1 = new MeiTuanStoreMapUrlRequest(); request1.StoreId = Global.Instance.BusinessPlanLog.StoreId; request1.BusinessId = "2"; var response1 = OtherWaiMaiUtils.MeiTuanStoreMapUrl(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 { MeiTuanStoreMapRelaseUrlRequest request = new MeiTuanStoreMapRelaseUrlRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.BusinessId = "2"; var response = OtherWaiMaiUtils.MeiTuanStoreMapRelaseUrl(request); //成功 if (response.Item1) { this.ShowToastNotify(this, response.Item2); //打开二维码生成界面 var form = new WaiMaiBindForm(response.Item3.Data.Url); form.ShowDialog(); } else { this.ShowToastNotify(this, response.Item2); } } catch (Exception ex) { this.ShowToastNotify(this, "美团解绑链接生成失败!"); LOGGER.Error(ex, "美团解绑链接生成失败"); } } } }