using DevComponents.DotNetBar; using DevComponents.DotNetBar.Controls; using DevComponents.DotNetBar.SuperGrid; using POSV.Component; using POSV.PayApi; using POSV.Payment.Saobei; using POSV.Payment.Saobei.Parameter; 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.Tasks; using System.Windows.Forms; namespace POSV.GuangChang { public partial class GuangChangForm : BusinessForm { public int orderType = 0; private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); public List orderPayInfo = null; /// /// 订单内容 /// public List orderProductInfo = null; /// /// 做法内容 /// public List orderProductMake = null; public GuangChangForm() { InitializeComponent(); this.controlBox1.Text = "美食广场小程序订单查询"; this.controlBox1.ShowApplicationVersion = false; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; this.startPicker.Value = DateTime.Parse(Global.Instance.BusinessPlan.StartTimeSimple); this.endPicker.Value = DateTime.Parse(Global.Instance.BusinessPlan.EndTimeSimple); this.checkBoxX1.Checked = true; this.Focus(); this.mobile.Focus(); this.mobile.SelectAll(); this.ActiveControl = this.mobile; //获得当前页 int cur = pagerControl1.CurrentPage; //获得每页显示的记录数 int rows = pagerControl1.RowsPerPage; QueryTicket(cur, rows); } private void BtnQueryClick(object sender, EventArgs e) { //获得当前页 int cur = pagerControl1.CurrentPage; //获得每页显示的记录数 int rows = pagerControl1.RowsPerPage; QueryTicket(cur, rows); } public void QueryTicket(int PageNum, int pageSize) { try { var request = new VposOrderListRequest(); request.StoreId = Global.Instance.Authc.StoreId; request.Status = orderType; request.PageNumber = PageNum; request.PageSize = pageSize; request.StartTime = this.startPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"); request.EndTime = this.endPicker.Value.ToString("yyyy-MM-dd HH:mm:ss"); request.Mobile = this.mobile.Text; request.SeqNo = this.seqNo.Text; var response = GuangChangUtils.VposOrderList(request); //成功 if (response.Item1) { List cardPointChangeResponse = response.Item3.List; this.pagerControl1.TotalPage = response.Item3.PageCount; this.pagerControl1.CurrentPage = response.Item3.PageNumber; this.pagerControl1.RecordCount = response.Item3.TotalCount; this.pagerControl1.RowsPerPage = response.Item3.PageSize; foreach (VposOrder vposOrder in cardPointChangeResponse) { if (vposOrder.Status == 0) { vposOrder.StatusDesc = "待支付"; } if (vposOrder.Status == 1) { vposOrder.StatusDesc = "已支付"; } if (vposOrder.Status == 2) { vposOrder.StatusDesc = "已退单"; } if (vposOrder.Status == 3) { vposOrder.StatusDesc = "已取消"; } if (vposOrder.Status == 4) { vposOrder.StatusDesc = "已完成"; } if (vposOrder.BusMode == 0) { vposOrder.OrderTypeDesc = "堂食"; } if (vposOrder.BusMode == 1) { vposOrder.OrderTypeDesc = "外带"; } } salesListTable.PrimaryGrid.DataSource = cardPointChangeResponse; } else { List list = new List(); salesListTable.PrimaryGrid.DataSource = list; } } catch (Exception ex) { this.ShowToastNotify(this, "订单记录获取异常"); LOGGER.Error(ex, "订单记录获取异常"); } } private void BtnBackTicketClick(object sender, EventArgs e) { string permissionCode = "10043"; var action = new Action(() => { var panel = salesListTable.PrimaryGrid; if (panel.ActiveRow == null) { this.ShowToastNotify(this, "请选择要操作的单据"); return; } //提示 var row = panel.ActiveRow as GridRow; var tradeNo = row.Cells["no"].Value.ToString(); var seqNo = row.Cells["seqNo"].Value.ToString(); var receivable = row.Cells["receivable"].Value.ToString(); bool allowBackPayHistory = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_BACKPAY_HISTORY, true); //不允许退历史单据 if (!allowBackPayHistory) { //判断是否是隔天的单据 var finishDate = row.Cells["saleDate"].Value.ToString(); string ticketDate = DateTime.Parse(finishDate).ToString("yyyy-MM-dd"); if (!ticketDate.Equals(DateTime.Now.ToString("yyyy-MM-dd"))) { //不是同一天,查询设置 this.ShowToastNotify(this, "只能退款当日单据!"); return; } } //if ("已退单".Equals(row.Cells["status"].Value.ToString())) //{ // this.ShowToastNotify(this, "订单已完全退单"); // return; //} if ("已取消".Equals(row.Cells["status"].Value.ToString())) { this.ShowToastNotify(this, "订单已已取消,不能进行退款"); return; } if ("待支付".Equals(row.Cells["status"].Value.ToString())) { this.ShowToastNotify(this, "订单未支付"); return; } var refundFrom = new GuangChangRefundForm(orderProductInfo, orderProductMake); refundFrom.AcceptButtonClick += (o, args) => { List backList = (List)args.Data; decimal rTotalAmount = 0.00M; foreach (VposOrderProduct product in backList) { rTotalAmount = rTotalAmount + product.RfAmount; } //获取支付订单 if (orderPayInfo == null || orderPayInfo.Count <= 0) { this.ShowToastNotify(this, "支付订单获取失败"); return; } VposOrderPay vposOrderPay = orderPayInfo[0]; int PayChannel = vposOrderPay.PayChannel; if (PayChannel == (int)PayChannelEnum.扫呗支付) { //进行退单请求 var res = SaobeiApi.GetSaobeiParameter(AccountTypeEnum.门店); var parameter = res.Item3; //银联商务支付参数 string merchant_no = parameter.ContainsKey("merchant_no") ? parameter["merchant_no"].ToString() : ""; string terminal_id = parameter.ContainsKey("terminal_id") ? parameter["terminal_id"].ToString() : ""; string signKey = parameter.ContainsKey("signKey") ? parameter["signKey"].ToString() : ""; string gatewayUrl = parameter.ContainsKey("gatewayUrl") ? parameter["gatewayUrl"].ToString() : ""; SaobeiRefundParam request = new SaobeiRefundParam(); string payType = "020"; if ("04".Equals(vposOrderPay.PayTypeNo)) { payType = "020"; } else if ("05".Equals(vposOrderPay.PayTypeNo)) { payType = "010"; } request.Pay_type = payType; request.Terminal_trace = tradeNo; request.Refund_fee = string.Format("{0}", Convert.ToInt32(Math.Abs(rTotalAmount) * 100)); request.Out_trade_no = vposOrderPay.VoucherNo; this.ShowToastNotify(this, "正在进行退款...请勿关闭!", 30000); Task.Factory.StartNew(() => { var upayPayment = SaobeiUtils.SaobeiRefund(merchant_no, terminal_id, signKey, gatewayUrl, request); if (!upayPayment.Item1) { this.ShowToastNotify(this, upayPayment.Item2); return; } else { VposStoreBusinessTicketRefundPart refundPart = new VposStoreBusinessTicketRefundPart(); refundPart.StoreId = Global.Instance.Authc.StoreId; refundPart.StoreName = Global.Instance.Authc.StoreName; refundPart.StoreNo = Global.Instance.Authc.StoreNo; refundPart.WorkNo = Global.Instance.BusinessPlanLog.WorkerNo; refundPart.SaleDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); refundPart.DeviceName = DeviceUtils.Instance.ComputerName; refundPart.DeviceMac = DeviceUtils.Instance.MacAddress; refundPart.DeviceIp = DeviceUtils.Instance.IPAddress; refundPart.PosNo = Global.Instance.BusinessPlanLog.PosNo; List orderProduct = new List(); foreach (VposOrderProduct product in backList) { VposStoreOrderProductRefundPart item = new VposStoreOrderProductRefundPart(); item.Id = product.Id; item.ClientId = IdWorkerUtils.Instance.NextId(); item.ProductId = product.ProductId; item.ProductNo = product.ProductNo; item.ProductName = product.ProductName; item.ProductUnitId = product.ProductUnitId; item.ProductUnitName = product.ProductUnitName; item.SeriesId = product.SeriesId; item.SeriesName = product.SeriesName; item.TypePath = product.TypePath; item.TypeId = product.TypeId; item.TypeName = product.TypeName; item.SpecId = product.SpecId; item.SpecName = product.SpecName; item.Count = product.Count; item.Rcount = product.Rcount; item.Price = product.Price; item.Brcount = product.RfCount; item.Amount = product.RfAmount; List tempList = new List(); List makeList = product.MakeInfo; if (makeList != null && makeList.Count > 0) { foreach (VposOrderProductMake make in makeList) { VposStoreOrderProductMakeRefundPart makeRefundPart = new VposStoreOrderProductMakeRefundPart(); makeRefundPart.ClientId = IdWorkerUtils.Instance.NextId(); makeRefundPart.OrderItemId = item.ClientId; makeRefundPart.MakeId = make.MakeId; makeRefundPart.MakeName = make.MakeName; makeRefundPart.AddPrice = make.AddPrice; makeRefundPart.Brcount = product.RfCount; tempList.Add(makeRefundPart); } } item.ProductMake = tempList; orderProduct.Add(item); } refundPart.OrderProduct = orderProduct; List orderPay = new List(); VposStorePayRefundPart vposStorePayRefundPart = new VposStorePayRefundPart(); vposStorePayRefundPart.ClientId = IdWorkerUtils.Instance.NextId(); vposStorePayRefundPart.PayNo = vposOrderPay.PayNo; vposStorePayRefundPart.PayTypeNo = vposOrderPay.PayTypeNo; vposStorePayRefundPart.PayType = vposOrderPay.PayType; vposStorePayRefundPart.Paid = rTotalAmount; vposStorePayRefundPart.Money = rTotalAmount; vposStorePayRefundPart.VoucherNo = upayPayment.Item3.Out_refund_no; vposStorePayRefundPart.PayDate = refundPart.SaleDate; vposStorePayRefundPart.Cardno = vposOrderPay.Cardno; vposStorePayRefundPart.CardYe = vposOrderPay.CardYe; vposStorePayRefundPart.CardJf = vposOrderPay.CardJf; vposStorePayRefundPart.IncomeFlag = vposOrderPay.IncomeFlag; vposStorePayRefundPart.OtherRateType = vposOrderPay.OtherRateType; vposStorePayRefundPart.OtherRateValue = vposOrderPay.OtherRateValue; vposStorePayRefundPart.OtherRate = vposOrderPay.OtherRate; vposStorePayRefundPart.PayChannel = vposOrderPay.PayChannel; orderPay.Add(vposStorePayRefundPart); refundPart.OrderPay = orderPay; var request1 = new VposOrderRefundPartRequest(); request1.StoreId = Global.Instance.Authc.StoreId; request1.TradeNo = tradeNo; request1.PayRefundNo = upayPayment.Item3.Out_refund_no; request1.RefundPart = refundPart; var response = GuangChangUtils.VposOrderRefundPart(request1); if (response.Item1) { this.ShowToastNotify(this, "退款成功"); //获得当前页 int cur = pagerControl1.CurrentPage; //获得每页显示的记录数 int rows = pagerControl1.RowsPerPage; QueryTicket(cur, rows); } } }); } //会员退款 if (vposOrderPay.PayTypeNo.Equals("02")) { Proxy.Member.Trade.MemberTradeProxy _proxy = new Proxy.Member.Trade.MemberTradeProxy(); Card.CardTradeRefundRequest _request = new Card.CardTradeRefundRequest(); _request.TradeVoucherNo = vposOrderPay.VoucherNo; _request.WorkerNo = Global.Instance.Worker.No; _request.TradeNo = tradeNo; _request.TotalPoint = 0; _request.TotalAmount = (int)vposOrderPay.Money * 100; _request.TicketNo = vposOrderPay.TicketId; _request.SourceSign = "pos"; _request.ShopNo = Global.Instance.BusinessPlanLog.StoreNo; _request.Reason = ""; _request.PosNo = Global.Instance.Authc.PosNo; _request.CardInfo = new List() { new Card.CardInfo() { Amount = (int)vposOrderPay.Money * 100, CardNo = vposOrderPay.Cardno } }; var _data = _proxy.MemberTradeRefund(_request); if (!_data.Item1) { this.ShowToastNotify(this, _data.Item2); return; } VposStoreBusinessTicketRefundPart refundPart = new VposStoreBusinessTicketRefundPart(); refundPart.StoreId = Global.Instance.Authc.StoreId; refundPart.StoreName = Global.Instance.Authc.StoreName; refundPart.StoreNo = Global.Instance.Authc.StoreNo; refundPart.WorkNo = Global.Instance.BusinessPlanLog.WorkerNo; refundPart.SaleDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); refundPart.DeviceName = DeviceUtils.Instance.ComputerName; refundPart.DeviceMac = DeviceUtils.Instance.MacAddress; refundPart.DeviceIp = DeviceUtils.Instance.IPAddress; refundPart.PosNo = Global.Instance.BusinessPlanLog.PosNo; List orderProduct = new List(); foreach (VposOrderProduct product in backList) { VposStoreOrderProductRefundPart item = new VposStoreOrderProductRefundPart(); item.Id = product.Id; item.ClientId = IdWorkerUtils.Instance.NextId(); item.ProductId = product.ProductId; item.ProductNo = product.ProductNo; item.ProductName = product.ProductName; item.ProductUnitId = product.ProductUnitId; item.ProductUnitName = product.ProductUnitName; item.SeriesId = product.SeriesId; item.SeriesName = product.SeriesName; item.TypePath = product.TypePath; item.TypeId = product.TypeId; item.TypeName = product.TypeName; item.SpecId = product.SpecId; item.SpecName = product.SpecName; item.Count = product.Count; item.Rcount = product.Rcount; item.Price = product.Price; item.Brcount = product.RfCount; item.Amount = product.RfAmount; List tempList = new List(); List makeList = product.MakeInfo; if (makeList != null && makeList.Count > 0) { foreach (VposOrderProductMake make in makeList) { VposStoreOrderProductMakeRefundPart makeRefundPart = new VposStoreOrderProductMakeRefundPart(); makeRefundPart.ClientId = IdWorkerUtils.Instance.NextId(); makeRefundPart.OrderItemId = item.ClientId; makeRefundPart.MakeId = make.MakeId; makeRefundPart.MakeName = make.MakeName; makeRefundPart.AddPrice = make.AddPrice; makeRefundPart.Brcount = product.RfCount; tempList.Add(makeRefundPart); } } item.ProductMake = tempList; orderProduct.Add(item); } refundPart.OrderProduct = orderProduct; List orderPay = new List(); VposStorePayRefundPart vposStorePayRefundPart = new VposStorePayRefundPart(); vposStorePayRefundPart.ClientId = IdWorkerUtils.Instance.NextId(); vposStorePayRefundPart.PayNo = vposOrderPay.PayNo; vposStorePayRefundPart.PayTypeNo = vposOrderPay.PayTypeNo; vposStorePayRefundPart.PayType = vposOrderPay.PayType; vposStorePayRefundPart.Paid = rTotalAmount; vposStorePayRefundPart.Money = rTotalAmount; vposStorePayRefundPart.VoucherNo = _data.Item3.RefNo; vposStorePayRefundPart.PayDate = refundPart.SaleDate; vposStorePayRefundPart.Cardno = vposOrderPay.Cardno; vposStorePayRefundPart.CardYe = vposOrderPay.CardYe; vposStorePayRefundPart.CardJf = vposOrderPay.CardJf; vposStorePayRefundPart.IncomeFlag = vposOrderPay.IncomeFlag; vposStorePayRefundPart.OtherRateType = vposOrderPay.OtherRateType; vposStorePayRefundPart.OtherRateValue = vposOrderPay.OtherRateValue; vposStorePayRefundPart.OtherRate = vposOrderPay.OtherRate; vposStorePayRefundPart.PayChannel = vposOrderPay.PayChannel; orderPay.Add(vposStorePayRefundPart); refundPart.OrderPay = orderPay; var request1 = new VposOrderRefundPartRequest(); request1.StoreId = Global.Instance.Authc.StoreId; request1.TradeNo = tradeNo; request1.PayRefundNo = _data.Item3.RefNo; request1.RefundPart = refundPart; var response = GuangChangUtils.VposOrderRefundPart(request1); if (response.Item1) { this.ShowToastNotify(this, "退款成功"); //获得当前页 int cur = pagerControl1.CurrentPage; //获得每页显示的记录数 int rows = pagerControl1.RowsPerPage; QueryTicket(cur, rows); } } }; var trans = new TransparentForm(this, refundFrom); trans.Show(this); }); var ret = AuthzUtils.Instance.CheckAuthz(this, "退单", permissionCode, action); if (!ret.Item1) { this.ShowToastNotify(this, ret.Item2); } } private void BtnExitClick(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void BtnTimeClick(object sender, EventArgs e) { var obj = sender as ButtonX; var typeStr = obj.Tag as string; var type = (ReportQuickDate)Enum.Parse(typeof(ReportQuickDate), typeStr); var res = DateTimeUtils.CalculateBusinessPlanDate(type, this.startPicker.Value, this.endPicker.Value); this.startPicker.Value = res.Item1; this.endPicker.Value = res.Item2; //获得当前页 int cur = pagerControl1.CurrentPage; //获得每页显示的记录数 int rows = pagerControl1.RowsPerPage; QueryTicket(cur, rows); } private void OnBind(object sender, DevComponents.DotNetBar.SuperGrid.GridDataBindingCompleteEventArgs e) { var panel = e.GridPanel; foreach (var r in panel.Rows) { var row = r as GridRow; //设置单据内容字体颜色 if ("已退单".Equals(row.Cells["status"].Value.ToString())) { row.CellStyles.Default.TextColor = Color.Red; } else { row.CellStyles.Default.TextColor = Color.Black; } } } private void OnTicketRowActivated(object sender, DevComponents.DotNetBar.SuperGrid.GridRowActivatedEventArgs e) { GridPanel grid = e.GridPanel; if (e.NewActiveRow != null) { productListTable.PrimaryGrid.Rows.Clear(); payListTable.PrimaryGrid.Rows.Clear(); //先清除其他表数据 GridRow row = e.NewActiveRow as GridRow; grid.SetSelected(e.NewActiveRow, false); grid.SetActiveRow(e.NewActiveRow); var tradeNo = row.Cells["no"].Value.ToString(); var request = new VposOrderDetailRequest(); request.StoreId = Global.Instance.Authc.StoreId; request.TradeNo = tradeNo; try { var response = GuangChangUtils.VposOrderDetail(request); //商品数据 if (response.Item3.Data.OrderProduct != null) { List list = response.Item3.Data.OrderProduct; foreach (VposOrderProduct vposOrderProduct in list) { if (vposOrderProduct.IsSuit == 1) { vposOrderProduct.RowState = "普通菜"; } if (vposOrderProduct.IsSuit == 2) { vposOrderProduct.RowState = "套餐主菜"; } if (vposOrderProduct.IsSuit == 3) { vposOrderProduct.RowState = "明细菜"; } } productListTable.PrimaryGrid.DataSource = list; } else { productListTable.PrimaryGrid.Rows.Clear(); } //做法信息 if (response.Item3.Data.MakeInfo != null) { productMakeListTable.PrimaryGrid.DataSource = response.Item3.Data.MakeInfo; } else { productMakeListTable.PrimaryGrid.Rows.Clear(); } //支付信息 if (response.Item3.Data.PayInfo != null) { payListTable.PrimaryGrid.DataSource = response.Item3.Data.PayInfo; orderPayInfo = response.Item3.Data.PayInfo; orderProductInfo = response.Item3.Data.OrderProduct; orderProductMake = response.Item3.Data.MakeInfo; } else { payListTable.PrimaryGrid.Rows.Clear(); orderPayInfo = null; orderProductInfo = null; orderProductMake = null; } } catch (Exception ex) { productListTable.PrimaryGrid.Rows.Clear(); productMakeListTable.PrimaryGrid.Rows.Clear(); payListTable.PrimaryGrid.Rows.Clear(); orderPayInfo = null; orderProductInfo = null; orderProductMake = null; this.ShowToastNotify(this, "订单详情获取异常"); LOGGER.Error(ex, "订单详情获取异常"); } } else { productListTable.PrimaryGrid.Rows.Clear(); productMakeListTable.PrimaryGrid.Rows.Clear(); payListTable.PrimaryGrid.Rows.Clear(); } } private void OnControlBoxCloseClick(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 OnControlBoxMinClick(object sender, EventArgs e) { this.WindowState = FormWindowState.Minimized; } private void CbChangeClick(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; } this.mobile.Focus(); this.mobile.SelectAll(); //获得当前页 int cur = pagerControl1.CurrentPage; //获得每页显示的记录数 int rows = pagerControl1.RowsPerPage; QueryTicket(cur, rows); } private void OnQueryPageChangeWithObject(object obj) { //获得当前页 int cur = pagerControl1.CurrentPage; //获得每页显示的记录数 int rows = pagerControl1.RowsPerPage; PagerControl pager = obj as PagerControl; if (pager != null) { QueryTicket(cur, rows); } } } }