You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

685 lines
32 KiB
C#

9 months ago
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<VposOrderPay> orderPayInfo = null;
/// <summary>
/// 订单内容
/// </summary>
public List<VposOrderProduct> orderProductInfo = null;
/// <summary>
/// 做法内容
/// </summary>
public List<VposOrderProductMake> 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<VposOrder> 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<VposOrder> list = new List<VposOrder>();
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<VposOrderProduct> backList = (List<VposOrderProduct>)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<VposStoreOrderProductRefundPart> orderProduct = new List<VposStoreOrderProductRefundPart>();
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<VposStoreOrderProductMakeRefundPart> tempList = new List<VposStoreOrderProductMakeRefundPart>();
List<VposOrderProductMake> 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<VposStorePayRefundPart> orderPay = new List<VposStorePayRefundPart>();
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<Card.CardInfo>()
{
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<VposStoreOrderProductRefundPart> orderProduct = new List<VposStoreOrderProductRefundPart>();
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<VposStoreOrderProductMakeRefundPart> tempList = new List<VposStoreOrderProductMakeRefundPart>();
List<VposOrderProductMake> 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<VposStorePayRefundPart> orderPay = new List<VposStorePayRefundPart>();
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<VposOrderProduct> 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);
}
}
}
}