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.

543 lines
21 KiB
C#

using DevComponents.DotNetBar.Controls;
using NLog;
using POSV.Card;
using POSV.Component;
using POSV.Entity;
using POSV.Helper;
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.Reflection;
using System.Text;
using System.Windows.Forms;
namespace POSV.Member
{
public partial class GiftCardForm : BusinessForm
{
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
private List<PayMode> payTypeList = new List<PayMode>();
private string payTypeNo = "";
private string payTypeName = "请选择支付方式";
/// <summary>
/// 支付渠道
/// </summary>
private PayChannelEnum _payChannel = PayChannelEnum.;
//充值单号
private string outTradeNo = null;
private QueryGiftCardDetailResponse queryGiftCardDetailResponse;
public GiftCardForm()
{
InitializeComponent();
this.controlBox.Text = "礼品卡销售";
this.controlBox.ShowApplicationVersion = false;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.Focus();
this.txtInput.Focus();
this.txtInput.SelectAll();
this.ActiveControl = this.txtInput;
//填充支付方式
InitPayType();
}
private void InitPayType()
{
try
{
using (var db = Global.Instance.OpenDataBase)
{
StringBuilder sqlBuf = new StringBuilder();
sqlBuf.Append(" select no,name from pos_paymode where rechargeFlag = 1 ");
sqlBuf.Append(" order by no;");
List<PayMode> list = db.Fetch<PayMode>(sqlBuf.ToString());
List<PayMode> listCommon = new List<PayMode>();
List<PayMode> listSaoMa = new List<PayMode>();
foreach (PayMode payMode in list)
{
if (payMode.No.Equals("04") || payMode.No.Equals("05"))
{
listSaoMa.Add(payMode);
}
else
{
listCommon.Add(payMode);
}
}
PayMode defaultPayMode = new PayMode();
defaultPayMode.Name = "请选择支付方式";
payTypeList.Add(defaultPayMode);
if (listSaoMa != null && listSaoMa.Count > 0)
{
PayMode saomaPayMode = new PayMode();
saomaPayMode.No = "04";
saomaPayMode.Name = "扫码支付";
payTypeList.Add(saomaPayMode);
}
if (listCommon != null && listCommon.Count > 0)
{
payTypeList.AddRange(listCommon);
}
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
this.payTypeCheckBox.DisplayMember = "name";
this.payTypeCheckBox.ValueMember = "no";
this.payTypeCheckBox.DataSource = payTypeList;
this.payTypeCheckBox.SelectedIndexChanged += OnPayTypeSelectedIndexChanged;
}
private void OnPayTypeSelectedIndexChanged(object sender, EventArgs e)
{
var obj = sender as ComboBoxEx;
payTypeNo = StringUtils.GetString(obj.SelectedValue);
PayMode payMode = payTypeList.Find(x => payTypeNo.Equals(x.No));
if (payMode != null)
{
payTypeName = payMode.Name;
}
else
{
payTypeName = "";
}
}
/// <summary>
/// 关闭窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnCloseTouchClick(object sender, EventArgs e)
{
//先关闭父窗体
if (this.Owner != null)
{
this.Owner.Close();
}
//再关闭当前窗体
this.Close();
}
/// <summary>
/// 打开键盘
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnControlBoxKeyboardClick(object sender, EventArgs e)
{
try
{
KeyboardType keyboardType = KeyboardType.;
Type type = this.ActiveControl.GetType();
PropertyInfo pinfo = type.GetProperty("Keyboard");
if (pinfo != null)
{
keyboardType = (KeyboardType)pinfo.GetValue(this.ActiveControl, null);
}
var keyboard = Application.OpenForms["VirtualKeyboard"];
if (keyboard == null)
{
keyboard = new VirtualKeyboard(keyboardType);
}
((VirtualKeyboard)keyboard).ShowVirtualKeyboard(this, keyboardType);
}
catch (Exception ex)
{
LOGGER.Error(ex, "打开屏幕键盘异常");
}
}
/// <summary>
/// 读卡
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnReadCardClick(object sender, EventArgs e)
{
var result = CardOperateUtils.Instance.ReadCardNo();
if (result.Item1)
{
this.txtInput.Text = result.Item2;
//读卡成功,模拟回车事件
InputSimulatorUtils.SendKey(KeyCodes.Map["return"]);
}
else
{
result = CardOperateUtilsOther.Instance.ReadCardNo();
if (result.Item1)
{
this.txtInput.Text = result.Item2;
//读卡成功,模拟回车事件
InputSimulatorUtils.SendKey(KeyCodes.Map["return"]);
}
else
{
this.ShowMessage(lblInfo, result.Item2);
}
}
}
/// <summary>
/// 回车键
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnFinishedClick(object sender, EnterEventArg e)
{
var isVerify = InputVerify();
if (isVerify)
{
var voucherNo = this.txtInput.Text;
CardGiftMessage(voucherNo);
}
}
/// <summary>
/// 礼品卡信息
/// </summary>
private void CardGiftMessage(string cardNo)
{
queryGiftCardDetailResponse = null;
this.labelX7.Text = "";//礼品卡方案
this.labelX5.Text = "";//礼品卡面额
this.labelX6.Text = "";//礼品卡建议零售价
this.numericTextBox1.Text = "";//礼品卡付款金额
//第一步先校验礼品卡是否卡销售
try
{
var requestCheck = new CheckSaleGiftCardRequest();
requestCheck.CardNo = cardNo;
requestCheck.ShopNo = Global.Instance.Authc.StoreNo;
requestCheck.PosNo = Global.Instance.Authc.PosNo;
requestCheck.WorkerNo = Global.Instance.Worker.No;
var responseCheck = CardUtils.CheckSaleGiftCard(requestCheck);
if (responseCheck.Item1)
{
var request = new QueryGiftCardDetailRequest();
request.CardNo = cardNo;
request.ShopNo = Global.Instance.Authc.StoreNo;
request.PosNo = Global.Instance.Authc.PosNo;
request.WorkerNo = Global.Instance.Worker.No;
var response = CardUtils.QueryGiftCardDetail(request);
//成功
if (response.Item1)
{
queryGiftCardDetailResponse = response.Item3.Data;
this.labelX7.Text = queryGiftCardDetailResponse.SchemeName;//礼品卡方案
this.labelX5.Text = string.Format("{0}", queryGiftCardDetailResponse.FaceValue);//礼品卡面额
this.labelX6.Text = string.Format("{0}", queryGiftCardDetailResponse.RetailPrice);//礼品卡建议零售价
this.numericTextBox1.Text = string.Format("{0}", queryGiftCardDetailResponse.RetailPrice);//礼品卡付款金额
ShowMessage(this.lblInfo, response.Item2, false);
}
else
{
ShowMessage(this.lblInfo, response.Item2, true);
}
}
else {
ShowMessage(this.lblInfo, responseCheck.Item2, true);
}
}
catch (Exception ex)
{
ShowMessage(this.lblInfo, "礼品卡信息查询异常", true);
LOGGER.Error(ex, "礼品卡信息查询异常");
}
}
/// <summary>
/// 输入是否验证通过
/// </summary>
private bool InputVerify()
{
if (string.IsNullOrEmpty(this.txtInput.Text.Trim()))
{
ShowMessage(this.lblInfo, "请输入卡号信息", false);
return false;
}
return true;
}
/// <summary>
/// 退出按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnExitClick(object sender, EventArgs e)
{
OnCloseTouchClick(sender, e);
}
/// <summary>
/// 数字键
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnBtnCustomClick(object sender, EventArgs e)
{
var item = sender as NumericTextBox;
NumericKeyboard.ShowKeyboard(this, item);
}
private void BtnQueryClick(object sender, EventArgs e)
{
var isVerify = InputVerify();
if (isVerify)
{
var voucherNo = this.txtInput.Text;
CardGiftMessage(voucherNo);
}
}
/// <summary>
/// 确定销售
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnClickOk(object sender, EventArgs e)
{
if (queryGiftCardDetailResponse != null)
{
decimal money = StringUtils.GetDecimal(this.numericTextBox1.Text);
if (queryGiftCardDetailResponse.CardNo == null || "".Equals(queryGiftCardDetailResponse.CardNo))
{
ShowMessage(this.lblInfo, "请输入先获取卡号", true);
return;
}
if (money <= 0)
{
ShowMessage(this.lblInfo, "请输入充值金额", true);
return;
}
if ("".Equals(payTypeNo))
{
ShowMessage(this.lblInfo, "请选择支付方式", true);
return;
}
ShowMessage(this.lblInfo, "正在销售", true);
this.outTradeNo = string.Format("{0}_{1}{2}", Global.Instance.Authc.StoreNo, Global.Instance.Authc.PosNo, DateTime.Now.ToString("yyyyMMddHHmmss"));
//第一步,发起充值
if ("04".Equals(payTypeNo) || "05".Equals(payTypeNo))
{
//如果选择支付宝或者微信,先去扣钱
var form = new GiftCardSaomaForm(queryGiftCardDetailResponse.CardNo, money, this.outTradeNo);
form.OnSaomaResultClick += Form_OnSaomaResultClick;
TransparentForm trans = new TransparentForm(this, form);
trans.Show(this);
return;
}
else
{
DoSale(outTradeNo, money);
}
}
else {
ShowMessage(this.lblInfo, "请先刷卡", true);
}
}
private void Form_OnSaomaResultClick(GiftCardSaomaEventArgs e)
{
Tuple<bool, CardSaomaResult> saomaResult = e.SaomaResult;
//如果支付成功则进行充值
if (saomaResult.Item1)
{
this.payTypeNo = saomaResult.Item2.PayModeNo;
this.payTypeName = saomaResult.Item2.PayModeName;
this._payChannel = saomaResult.Item2.PayChannel;
try
{
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
logger.Info("单号:[{0}]更改扫码支付状态 payStatus==>1......开始", saomaResult.Item2.OutTradeNo);
string sql = "update pos_saoma_pay_ticket set payStatus =1 where orderNo = '{0}'";
sql = string.Format(sql, saomaResult.Item2.OutTradeNo);
db.Execute(sql, null);
transaction.Complete();
logger.Info("单号:[{0}]更改扫码支付状态 payStatus==>1......更新成功", saomaResult.Item2.OutTradeNo);
}
}
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
if (!string.IsNullOrEmpty(saomaResult.Item2.OutTradeNo))
{
DoSale(saomaResult.Item2.OutTradeNo, saomaResult.Item2.PayMoney, saomaResult.Item2.Out_trade_no);
}
else
{
DoSale(saomaResult.Item2.OutTradeNo, saomaResult.Item2.PayMoney);
}
}
}
public void DoSale(string payVoucherNo,decimal SaleAmount ,string OutTradeNo = "") {
try
{
var request = new SaleGiftCardRecordRequest();
request.CardNo = queryGiftCardDetailResponse.CardNo;
request.SaleAmount = SaleAmount;
request.PayTypeNo = payTypeNo;
request.PayType = payTypeName;
request.PayVoucherNo = payVoucherNo;
request.ShopNo = Global.Instance.Authc.StoreNo;
request.PosNo = Global.Instance.Authc.PosNo;
request.WorkerNo = Global.Instance.Worker.No;
var response = CardUtils.SaleGiftCardRecord(request);
//成功
if (response.Item1)
{
SaleGiftCardRecordResponse saleGiftCardRecordResponse = response.Item3.Data;
ShowMessage(this.lblInfo, response.Item2, true);
SaveSaleTickt(request, saleGiftCardRecordResponse, OutTradeNo);
}
else
{
ShowMessage(this.lblInfo, response.Item2, true);
}
}
catch (Exception ex)
{
ShowMessage(this.lblInfo, "礼品卡销售异常", true);
LOGGER.Error(ex, "礼品卡销售异常");
}
}
public void SaveSaleTickt(SaleGiftCardRecordRequest request,SaleGiftCardRecordResponse response,string out_trade_no = "") {
string busNo = this.outTradeNo.Split('_')[1];
CardSale entity = new CardSale();
entity.Id = IdWorkerUtils.Instance.NextId();
entity.TenantId = Global.Instance.BusinessPlanLog.TenantId;
entity.StoreId = Global.Instance.BusinessPlanLog.StoreId;
entity.StoreNo = Global.Instance.BusinessPlanLog.StoreNo;
entity.StoreName = Global.Instance.Authc.StoreName;
entity.WorkerId = Global.Instance.BusinessPlanLog.WorkerId;
entity.WorkerName = Global.Instance.BusinessPlanLog.WorkerName;
entity.WorkerNo = Global.Instance.BusinessPlanLog.WorkerNo;
entity.PosNo = Global.Instance.Authc.PosNo;
entity.ShiftName = Global.Instance.BusinessPlanLog.Name;
entity.ShiftNo = Global.Instance.BusinessPlanLog.No;
entity.PlanNo = response.SchemeNo;
entity.PlanName = response.SchemeName;
entity.CardNo = response.CardNo;
entity.BusNo = busNo;
entity.TicketNo = response.TicketNo;
entity.PayStatus = 1;//付款成功
entity.AuthCode = "";
entity.RetailPrice = response.RetailPrice;
entity.RealAmount = response.RealAmount;
entity.Money = request.SaleAmount;
string data = JsonUtils.Serialize(request);
entity.RequestMessage = data;
List<CardSalePay> pay = new List<CardSalePay>();
CardSalePay cardSalePay = new CardSalePay();
cardSalePay.Amount = request.SaleAmount;
cardSalePay.TicketId = entity.Id;
cardSalePay.PayName = payTypeName;
cardSalePay.PayNo = payTypeNo;
cardSalePay.TenantId = Global.Instance.BusinessPlanLog.TenantId;
cardSalePay.VoucherNo = this.outTradeNo;
cardSalePay.Id = IdWorkerUtils.Instance.NextId();
cardSalePay.PayChannel = this._payChannel;
cardSalePay.Memo = out_trade_no;
pay.Add(cardSalePay);
entity.Pay = pay;
try
{
lock (Global.Instance.SyncLock)
{
using (var db = Global.Instance.OpenDataBase)
{
using (var transaction = db.GetTransaction())
{
logger.Info("单号:[{0}]保存礼品卡销售订单......开始", entity.BusNo);
// 保存主单数据
db.Save<CardSale>(entity);
// 保存支付明细
List<CardSalePay> detail = entity.Pay;
if (detail != null && detail.Count > 0)
{
foreach (CardSalePay detailEntity in detail)
{
db.Save<CardSalePay>(detailEntity);
}
}
transaction.Complete();
logger.Info("单号:[{0}]保存礼品卡销售订单......成功", entity.BusNo);
}
}
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
//成功以后打印
this.ShowToastNotify(this, "开始打印");
//构建收银小票模版参数打印
var vars = CardHelper.BuilderGiftCardVariable(request, response,false,false);
//现金充值开钱箱
bool openCashbox = false;
if ("01".Equals(request.PayTypeNo))
{
openCashbox = true;
}
//充值打印份数
int ticketCount = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_RECHARGE_COUNT, 1);
//打印延迟
int delaySecond = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_CARD_PRINT_DELAY, 1);
//执行收银小票打印
Tuple<bool, string> result = CardHelper.PrinterTicket("礼品卡销售", vars, true, openCashbox, ticketCount, delaySecond);
this.ShowToastNotify(this, string.Format("{0}", result.Item2));
//打开提示界面
var form = new GiftCardResultForm(request, response);
form.ShowDialog();
//先关闭父窗体
if (this.Owner != null)
{
this.Owner.Close();
}
//再关闭当前窗体
this.Close();
}
}
}