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.WeiXin { public partial class WeiXinForm : BusinessForm { private int SelectType = 0;//待处理订单 private int WeiXinOrderStatus = -1;//查询的订单类型 private bool generalQuerying = false;//历史订单查询锁 private bool handleQuerying = false;//待处理订单查询锁 private int ConfirmType = 0; private bool ConfirmOrCanceling = false;//订单处理中 private bool isBudanFlag = false;//是否正在进行补单操作 private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); public WeiXinForm() { InitializeComponent(); this.dateInputPicker.Value = DateTime.Now.Date; //是否开启自动接单 bool openConfirm = Global.Instance.GlobalConfigBoolValue(ConfigConstant.WEIXIN_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); //第一步加载门店信息 QueryWeixinPoiInfo(); //第二步,获取待处理订单 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 == 1) { Dictionary messageMap = JsonUtils.Deserialize>(message); if (messageMap.ContainsKey("weixin") && !"".Equals(messageMap["weixin"])) { 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 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_openStore(object sender, EventArgs e) { WeiXinShopOpenRequest request = new WeiXinShopOpenRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OpenStatus = 1; var response = WeiXinOrderUtils.WeiXinShopOpen(request); if (response != null) { this.ShowToastNotify(this, response.Item2); if (response.Item1) { QueryWeixinPoiInfo(); } } } /// /// 门店门店信息 /// private void QueryWeixinPoiInfo() { WeiXinShopInfoRequest request = new WeiXinShopInfoRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; var response = WeiXinOrderUtils.WeiXinShopInfo(request); if (response != null && response.Item1) { var responseMessage = response.Item3; if (responseMessage != null && responseMessage.Data != null) { WeiXinShopInfoResponse 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.OpenTime); } } } /// /// 门店歇业 /// /// /// private void btn_closeStore(object sender, EventArgs e) { WeiXinShopOpenRequest request = new WeiXinShopOpenRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.OpenStatus = 0; var response = WeiXinOrderUtils.WeiXinShopOpen(request); if (response != null) { this.ShowToastNotify(this, response.Item2); if (response.Item1) { QueryWeixinPoiInfo(); } } } /// /// 待处理订单和历史订单查询切换 /// /// /// 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 btn_query(object sender, EventArgs e) { var button = sender as ButtonX; try { button.Enabled = false; DoQuery(1, pagerControl2.RowsPerPage); } finally { button.Enabled = true; } } private void DoQuery(int pageNum, int pageSize) { if (generalQuerying) { this.ShowToastNotify(this, "查询中....."); return; } generalQuerying = true; this.tableLayoutPanel2.Controls.Clear(); Task.Factory.StartNew(() => { WeiXinOrderListRequest request = new WeiXinOrderListRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; string orderDate = this.dateInputPicker.Text; request.Status = WeiXinOrderStatus; request.StartDate = string.Format("{0} 00:00:00", orderDate); request.EndDate = string.Format("{0} 23:59:59", orderDate); request.OrderField = "saleDate"; request.OrderType = "DESC"; request.PageNumber = pageNum; request.PageSize = pageSize; var response = WeiXinOrderUtils.QueryWeiXinOrder(request); if (response != null && response.Item1) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { List detailList = new List(); int handCount = 0; foreach (WeiXinOrderListResponse order in response.Item3.List) { if (order.Status == 1) { handCount = handCount + 1; } var item = new WeiXinOrderItem(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); } //更新控件 sendNewView(handCount); this.tableLayoutPanel2.Controls.Clear(); 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_OnConfirm(object sender, WeiXinOrderEventArgs e) { string orderId = e.OrderId; if (!ConfirmOrCanceling) { OrderOnConfirm(orderId); ConfirmOrCanceling = false; } else { this.ShowToastNotify(this, "订单正在处理中,请稍等"); } } /// /// 订单补单 /// /// /// private void Item_OnBuDan(object sender, WeiXinOrderEventArgs e) { if (isBudanFlag) { return; } isBudanFlag = true; string orderId = e.OrderId; string orderNo = e.OrderNo; OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo("7" + orderNo); //判断订单是否存在 if (_OrderObject == null) { try { //接单成功打印订单 WeiXinOrderRequest request1 = new WeiXinOrderRequest(); string orderDate = this.dateInputPicker.Text; request1.StoreId = Global.Instance.BusinessPlanLog.StoreId; request1.TicketId = orderId; request1.MemberId = ""; var response1 = WeiXinOrderUtils.WeiXinOrder(request1); if (response1 != null && response1.Item1) { //组装本地数据 OrderObject orderObject = OtherWaiMaiApi.getOrderLocalWeiXin(response1.Item3.Data); logger.Info("微信订单组装完成"); lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { //整单 db.Insert(orderObject); 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.InsertBatch(orderObject.Items); //添加支付汇总的必填字段 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); } } //优惠明细 foreach (var promotion in orderObject.Items) { if (promotion.Promotions.Count > 0) { db.InsertBatch(promotion.Promotions); } } //如果是外卖订单,存储配送信息 if (orderObject.OrderType == OrderType.微信点餐 && response1.Item3.Data.BusMode == 2) { WxWaimaiOrder wxWaimaiOrder = new WxWaimaiOrder(); wxWaimaiOrder.Id = IdWorkerUtils.Instance.NextId(); wxWaimaiOrder.TenantId = orderObject.TenantId; wxWaimaiOrder.TicketNo = orderObject.TradeNo; wxWaimaiOrder.StoreId = orderObject.StoreId; wxWaimaiOrder.StoreNo = orderObject.StoreNo; wxWaimaiOrder.StoreName = orderObject.StoreName; wxWaimaiOrder.WorkerNo = orderObject.WorkerNo; wxWaimaiOrder.ShiftId = Global.Instance.BusinessPlanLog.PlanId; wxWaimaiOrder.ShiftNo = Global.Instance.BusinessPlanLog.No; wxWaimaiOrder.ReceiveName = response1.Item3.Data.ReceiveName; wxWaimaiOrder.ReceiveMobile = response1.Item3.Data.ReceiveMobile; wxWaimaiOrder.ReceiveAddress = response1.Item3.Data.ReceiveAddress; wxWaimaiOrder.DistributionFee = response1.Item3.Data.DistributionFee; wxWaimaiOrder.Type = 1; wxWaimaiOrder.IsIncome = 1; wxWaimaiOrder.Status = 0; wxWaimaiOrder.CreateDate = orderObject.FinishDate; wxWaimaiOrder.CreateUser = orderObject.CreateUser; db.Insert(wxWaimaiOrder); } //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) { ConfirmOrCanceling = true; WeiXinOrderConfirmRequest request = new WeiXinOrderConfirmRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.TicketId = orderId; var response = WeiXinOrderUtils.WeiXinOrderConfirm(request); if (response != null) { this.ShowToastNotify(this, response.Item2); if (response.Item1) { try { LOGGER.Info("微信订单接单:" + response.Item2); //接单成功打印订单 WeiXinOrderRequest request1 = new WeiXinOrderRequest(); string orderDate = this.dateInputPicker.Text; request1.StoreId = Global.Instance.BusinessPlanLog.StoreId; request1.TicketId = orderId; request1.MemberId = ""; var response1 = WeiXinOrderUtils.WeiXinOrder(request1); if (response1 != null && response1.Item1) { OrderObject _OrderObject = OrderUtils.getOrderObjectByTranNo("7" + orderId); if (_OrderObject != null) { logger.Info("微信订单已存在"); return; } //组装本地数据 OrderObject orderObject = OtherWaiMaiApi.getOrderLocalWeiXin(response1.Item3.Data); logger.Info("微信订单组装完成"); lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { //整单 db.Insert(orderObject); 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.InsertBatch(orderObject.Items); //添加支付汇总的必填字段 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); } } //优惠明细 foreach (var promotion in orderObject.Items) { if (promotion.Promotions.Count > 0) { db.InsertBatch(promotion.Promotions); } } //如果是外卖订单,存储配送信息 if (orderObject.OrderType == OrderType.微信点餐 && response1.Item3.Data.BusMode == 2) { WxWaimaiOrder wxWaimaiOrder = new WxWaimaiOrder(); wxWaimaiOrder.Id = IdWorkerUtils.Instance.NextId(); wxWaimaiOrder.TenantId = orderObject.TenantId; wxWaimaiOrder.TicketNo = orderObject.TradeNo; wxWaimaiOrder.StoreId = orderObject.StoreId; wxWaimaiOrder.StoreNo = orderObject.StoreNo; wxWaimaiOrder.StoreName = orderObject.StoreName; wxWaimaiOrder.WorkerNo = orderObject.WorkerNo; wxWaimaiOrder.ShiftId = Global.Instance.BusinessPlanLog.PlanId; wxWaimaiOrder.ShiftNo = Global.Instance.BusinessPlanLog.No; wxWaimaiOrder.ReceiveName = response1.Item3.Data.ReceiveName; wxWaimaiOrder.ReceiveMobile = response1.Item3.Data.ReceiveMobile; wxWaimaiOrder.ReceiveAddress = response1.Item3.Data.ReceiveAddress; wxWaimaiOrder.DistributionFee = response1.Item3.Data.DistributionFee; wxWaimaiOrder.Type = 1; wxWaimaiOrder.IsIncome = 1; wxWaimaiOrder.Status = 0; wxWaimaiOrder.CreateDate = orderObject.FinishDate; wxWaimaiOrder.CreateUser = orderObject.CreateUser; db.Insert(wxWaimaiOrder); } //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, "开始打印"); //构建收银小票模版参数打印 var vars = WaiMaiHelper.BuilderWeiXinVariable(response1.Item3.Data, false); Tuple result = WaiMaiHelper.PrinterTicket("微信订单", vars); this.ShowToastNotify(this, string.Format("{0}", result.Item2)); //打印标签 LabelPrintHelper.PrintOrderLabel(orderObject); //执行厨打 ChuDaHelper.KitchenPrinter(orderObject); //执行厨打标签 ChuDaHelper.KitchenLabelPrinter(orderObject); //执行出品 ChuDaHelper.MadePrinter(orderObject); //通知厨显 UploadSCNewOrder.UploadNewOrder2SC4KDS(orderObject); }); } } catch (Exception ex) { LOGGER.Error(ex, "微信点餐接单异常"); } switch (SelectType) { case 0: DoHandQuery(); break; case 1: DoQuery(1, pagerControl2.RowsPerPage); break; } } } } /// /// 订单取消 /// /// /// private void Item_OnCancel(object sender, WeiXinOrderEventArgs e) { string orderId = e.OrderId; if (!ConfirmOrCanceling) { ConfirmOrCanceling = true; WeiXinOrderCancelRequest request = new WeiXinOrderCancelRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.TicketId = orderId; request.CancelReason = "对不起,门店这会实在忙不过来"; var response = WeiXinOrderUtils.WeiXinOrderCancel(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; } } } ConfirmOrCanceling = false; } else { this.ShowToastNotify(this, "订单正在处理中,请稍等"); } } /// /// 同意退单 /// /// /// private void Item_OnRefundAgree(object sender, WeiXinOrderEventArgs e) { string orderId = e.OrderId; string orderNo = e.OrderNo; string backCause = e.BackCause; WeiXinOrderRefundAgreeRequest request = new WeiXinOrderRefundAgreeRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.TicketId = orderId; var response = WeiXinOrderUtils.WeiXinOrderRefundAgree(request); if (response != null) { LOGGER.Info("微信订单同意退款:" + response.Item2); this.ShowToastNotify(this, response.Item2); if (response.Item1) { //退单业务处理,退单处理退本地单 this.DoRefund("7" + orderNo, backCause); switch (SelectType) { case 0: DoHandQuery(); break; case 1: DoQuery(1, pagerControl2.RowsPerPage); break; } } } } /// /// 拒绝退单 /// /// /// private void Item_OnRefundReject(object sender, WeiXinOrderEventArgs e) { string orderId = e.OrderId; if (!ConfirmOrCanceling) { ConfirmOrCanceling = true; WeiXinOrderRefundRefuseRequest request = new WeiXinOrderRefundRefuseRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.TicketId = orderId; request.RefuseReason = "对不起,菜品已做好,请稍等"; var response = WeiXinOrderUtils.WeiXinOrderRefundRefuse(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; } } } ConfirmOrCanceling = false; } else { this.ShowToastNotify(this, "订单正在处理中,请稍等"); } } /// /// 订单打印 /// /// /// private void Item_OnPrint(object sender, WeiXinOrderEventArgs e) { string orderId = e.OrderId; Task.Factory.StartNew(() => { WeiXinOrderRequest request = new WeiXinOrderRequest(); string orderDate = this.dateInputPicker.Text; request.StoreId = Global.Instance.BusinessPlanLog.StoreId; request.TicketId = orderId; request.MemberId = ""; var response = WeiXinOrderUtils.WeiXinOrder(request); if (response != null && response.Item1) { this.ShowToastNotify(this, "开始打印"); //打印入库 //构建收银小票模版参数打印 var vars = WaiMaiHelper.BuilderWeiXinVariable(response.Item3.Data, true); Tuple result = WaiMaiHelper.PrinterTicket("微信订单", vars); this.ShowToastNotify(this, string.Format("{0}", result.Item2)); //组装本地数据 OrderObject orderObject = OtherWaiMaiApi.getOrderLocalWeiXin(response.Item3.Data); //打印标签 LabelPrintHelper.PrintOrderLabel(orderObject); //执行厨打 ChuDaHelper.KitchenPrinter(orderObject); //执行厨打标签 ChuDaHelper.KitchenLabelPrinter(orderObject); //执行出品 ChuDaHelper.MadePrinter(orderObject); //通知厨显 UploadSCNewOrder.UploadNewOrder2SC4KDS(orderObject); } }); } //根据待处理订单的数量刷新提示 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 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.WEIXIN_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); } } private void DoHandQuery() { if (handleQuerying) { this.ShowToastNotify(this, "查询中....."); return; } handleQuerying = true; this.tableLayoutPanel1.Controls.Clear(); Task.Factory.StartNew(() => { WeiXinOrderListRequest request = new WeiXinOrderListRequest(); request.StoreId = Global.Instance.BusinessPlanLog.StoreId; string orderDate = this.dateInputPicker.Text; request.StartDate = string.Format("{0}", ""); request.Status = 1; request.EndDate = string.Format("{0}", ""); request.OrderField = "saleDate"; request.OrderType = "DESC"; request.PageNumber = 1; request.PageSize = 20; var response = WeiXinOrderUtils.QueryWeiXinOrder(request); if (response != null && response.Item1) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { List detailList = new List(); foreach (WeiXinOrderListResponse order in response.Item3.List) { var item = new WeiXinOrderItem(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); } this.tableLayoutPanel1.Controls.Clear(); 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 btn_getHandOrder(object sender, EventArgs e) { var button = sender as ButtonX; try { button.Enabled = false; DoHandQuery(); } finally { button.Enabled = true; } } private Tuple DoRefund(string tradeNo, string backCause) { 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; _BackOrderObject.RefundCause = backCause; //整单优惠 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; } 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); WxWaimaiOrder wxWaimaiOrder = db.FirstOrDefault("where ticketNo =@0;", tradeNo); //如果是外卖模式 //如果是外卖订单,存储配送信息 if (wxWaimaiOrder != null) { WxWaimaiOrder wxBackWaimaiOrder = new WxWaimaiOrder(); wxWaimaiOrder.Id = IdWorkerUtils.Instance.NextId(); wxWaimaiOrder.TenantId = wxWaimaiOrder.TenantId; wxWaimaiOrder.TicketNo = _OrderObject.TradeNo; wxWaimaiOrder.StoreId = _OrderObject.StoreId; wxWaimaiOrder.StoreNo = _OrderObject.StoreNo; wxWaimaiOrder.StoreName = _OrderObject.StoreName; wxWaimaiOrder.WorkerNo = _OrderObject.WorkerNo; wxWaimaiOrder.ShiftId = Global.Instance.BusinessPlanLog.PlanId; wxWaimaiOrder.ShiftNo = Global.Instance.BusinessPlanLog.No; wxWaimaiOrder.ReceiveName = wxWaimaiOrder.ReceiveName; wxWaimaiOrder.ReceiveMobile = wxWaimaiOrder.ReceiveMobile; wxWaimaiOrder.ReceiveAddress = wxWaimaiOrder.ReceiveAddress; wxWaimaiOrder.DistributionFee = wxWaimaiOrder.DistributionFee; wxWaimaiOrder.Type = 1; wxWaimaiOrder.IsIncome = 1; wxWaimaiOrder.Status = 1; wxWaimaiOrder.CreateDate = _OrderObject.FinishDate; wxWaimaiOrder.CreateUser = _OrderObject.CreateUser; db.Insert(wxWaimaiOrder); } 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 OnQueryPageChangeWithObject(object obj) { //获得当前页 int cur = pagerControl2.CurrentPage; //获得每页显示的记录数 int rows = pagerControl2.RowsPerPage; PagerControl pager = obj as PagerControl; if (pager != null) { DoQuery(cur, rows); } } } }