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 payTypeList = new List(); private string payTypeNo = ""; private string payTypeName = "请选择支付方式"; /// /// 支付渠道 /// 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 list = db.Fetch(sqlBuf.ToString()); List listCommon = new List(); List listSaoMa = new List(); 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 = ""; } } /// /// 关闭窗口 /// /// /// private void OnCloseTouchClick(object sender, EventArgs e) { //先关闭父窗体 if (this.Owner != null) { this.Owner.Close(); } //再关闭当前窗体 this.Close(); } /// /// 打开键盘 /// /// /// 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, "打开屏幕键盘异常"); } } /// /// 读卡 /// /// /// 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); } } } /// /// 回车键 /// /// /// private void OnFinishedClick(object sender, EnterEventArg e) { var isVerify = InputVerify(); if (isVerify) { var voucherNo = this.txtInput.Text; CardGiftMessage(voucherNo); } } /// /// 礼品卡信息 /// 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, "礼品卡信息查询异常"); } } /// /// 输入是否验证通过 /// private bool InputVerify() { if (string.IsNullOrEmpty(this.txtInput.Text.Trim())) { ShowMessage(this.lblInfo, "请输入卡号信息", false); return false; } return true; } /// /// 退出按钮 /// /// /// private void BtnExitClick(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } /// /// 数字键 /// /// /// 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); } } /// /// 确定销售 /// /// /// 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 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 pay = new List(); 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(entity); // 保存支付明细 List detail = entity.Pay; if (detail != null && detail.Count > 0) { foreach (CardSalePay detailEntity in detail) { db.Save(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 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(); } } }