using DevComponents.DotNetBar; using DevComponents.DotNetBar.Controls; using DevComponents.DotNetBar.Metro; using DevComponents.DotNetBar.SuperGrid; using NLog; using POS.Language.Language; using POSV.Bean; using POSV.Card; using POSV.Component; using POSV.Entity; using POSV.Helper; 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 CardRechargeForm : BusinessForm { private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); public string cardNo = null; public string faceNo = null; public string cardTypeId = null; public string schemeNo = null;//充值方案编号 public string giftDetailId = null;//礼品赠送ID public string couponDetailId = null;//卡券赠送ID public List schemeList = null; private string payTypeNo = ""; private string payTypeName = LangProxy.ToLang("请选择支付方式"); private decimal minMoney = 0.00M; private decimal maxMoney = 0.00M; public string cardTypeName = null; public bool isRecharge = false; public bool isPayUnRecharge = false;//支付成功但是充值失败 public string routTradeNo = "";//尝试重试的单号 public decimal rmoney = 0.00M;//尝试重试的金额 //金额赠送明细 List listDetail = null; //礼品赠送列表 List listGift = null; //卡券赠送列表 List listCoupon = null; private List payTypeList = new List(); //充值单号 private string outTradeNo = null; public CardRechargeForm() { InitializeComponent(); this.controlBox.Text = LangProxy.ToLang("会员卡充值"); this.controlBox.ShowApplicationVersion = false; } public CardRechargeForm(string CardNo) { InitializeComponent(); this.controlBox.Text = LangProxy.ToLang("会员卡充值"); this.controlBox.ShowApplicationVersion = false; this.cardNo = CardNo; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; DefaultGridStyle.setDefaultGridStyle(this.cardListTable); this.Focus(); this.txtInput.Focus(); this.txtInput.SelectAll(); this.ActiveControl = this.txtInput; //填充支付方式 InitPayType(); InitlizeOtherPayItem(""); if (this.cardNo != null) { this.txtInput.Text = cardNo; //如果卡号不为空加载会员信息 CardInfoMessage("cardNo"); } this.outTradeNo = string.Format("{0}_{1}{2}", Global.Instance.Authc.StoreNo, Global.Instance.Authc.PosNo, DateTime.Now.ToString("yyyyMMddHHmmss")); } 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 = LangProxy.ToLang("请选择支付方式"); payTypeList.Add(defaultPayMode); if (listSaoMa != null && listSaoMa.Count > 0) { PayMode saomaPayMode = new PayMode(); saomaPayMode.No = "04"; saomaPayMode.Name = LangProxy.ToLang("扫码支付"); 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 OnControlBoxCloseClick(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } 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 btn_exit_Click(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void OnFinishedClick(object sender, EventArgs e) { var isVerify = InputVerify(); if (isVerify) { var voucherNo = this.txtInput.Text; //智能识别刷卡方式 var way = CardUtils.JudgeCardWay(Global.Instance.Worker.TenantId, voucherNo); if (way == MemberCardNoType.未知) { this.ShowMessage(this.lblInfo, LangProxy.ToLang("无法识别的卡号,请确认"), true); return; } switch (way) { case MemberCardNoType.手机号: { CardInfoMessage("mobile"); } break; case MemberCardNoType.电子卡号: { CardInfoMessage("scanCode"); } break; case MemberCardNoType.真实卡号: { CardInfoMessage("cardNo"); } break; case MemberCardNoType.卡面号: { CardInfoMessage("surfaceNo"); } break; } } } /// /// 输入是否验证通过 /// private bool InputVerify() { if (string.IsNullOrEmpty(this.txtInput.Text.Trim())) { ShowMessage(this.lblInfo, "请输入卡号信息", false); return false; } return true; } /// /// 会员卡信息 /// private bool CardInfoMessage(string property) { bool result = false; try { var request = new MemberInfoQueryRequest(); request.Property = property; request.Keyword = this.txtInput.Text.Trim(); request.ShopNo = Global.Instance.Authc.StoreNo; request.PosNo = Global.Instance.Authc.PosNo; request.WorkerNo = Global.Instance.Worker.No; var response = CardUtils.MemberInfoQuery(request); //成功 if (response.Item1) { result = true; ShowMessage(this.lblInfo, response.Item2, false); MemberInfoQueryResponse memberInfoQueryResponse = response.Item3; lblMemerName.Text = memberInfoQueryResponse.Name; lblMemeberMobile.Text = memberInfoQueryResponse.Mobile; lblLinkPhone.Text = memberInfoQueryResponse.LinkPhone; switch (memberInfoQueryResponse.Sex) { case 0: lblSex.Text = "女"; break; case 1: lblSex.Text = "男"; break; default: lblSex.Text = "保密"; break; } lblBirthday.Text = memberInfoQueryResponse.Birthday; lblDescription.Text = memberInfoQueryResponse.Description; List list = memberInfoQueryResponse.CardList; foreach (MemberCard memberCard in list) { switch (memberCard.Status) { case 1: memberCard.CardStatus = "正常"; break; case 2: memberCard.CardStatus = "预售"; break; case 3: memberCard.CardStatus = "挂失"; break; case 4: memberCard.CardStatus = "冻结"; break; case 5: memberCard.CardStatus = "销户"; break; default: memberCard.CardStatus = "未知"; break; } } cardListTable.PrimaryGrid.DataSource = list; } else { result = false; lblMemerName.Text = ""; lblMemeberMobile.Text = ""; lblLinkPhone.Text = ""; lblSex.Text = ""; lblBirthday.Text = ""; lblDescription.Text = ""; List list = new List(); cardListTable.PrimaryGrid.DataSource = list; ShowMessage(this.lblInfo, response.Item2, true); } } catch (Exception ex) { result = false; ShowMessage(this.lblInfo, "会员卡信息查询异常", true); LOGGER.Error(ex, "会员卡信息查询异常"); } return result; } private void OnTicketRowActivated(object sender, DevComponents.DotNetBar.SuperGrid.GridRowActivatedEventArgs e) { //切换会员卡的时候重置方案相关ID schemeNo = null;//充值方案ID giftDetailId = null;//礼品赠送ID couponDetailId = null;//卡券赠送ID schemeList = null; //金额赠送明细 listDetail = null; //礼品赠送列表 listGift = null; //卡券赠送列表 listCoupon = null; //卡号 cardNo = null; //卡面号 faceNo = null; //卡类型 cardTypeId = null; GridPanel grid = e.GridPanel; if (e.NewActiveRow != null) { //先清除其他表数据 GridRow row = e.NewActiveRow as GridRow; grid.SetSelected(e.NewActiveRow, false); grid.SetActiveRow(e.NewActiveRow); cardNo = row.Cells["cardNo"].Value.ToString(); faceNo = row.Cells["faceNo"].Value.ToString(); cardTypeId = row.Cells["cardTypeId"].Value.ToString(); cardTypeName = row.Cells["cardTypeName"].Value.ToString(); string preAmount = row.Cells["totalAmount"].Value.ToString(); string perJifen = row.Cells["totalPoint"].Value.ToString(); this.preAmountTextBox.Text = preAmount;//充值前余额 this.perJifenTextBox.Text = perJifen;//充值前积分 try { var request = new CardRechargeSchemeListRequest(); request.CardTypeId = cardTypeId; request.ShopNo = Global.Instance.Authc.StoreNo; request.PosNo = Global.Instance.Authc.PosNo; var response = CardUtils.CardRechargeSchemeList(request); //成功 if (response.Item1) { schemeList = response.Item3.List; this.cmbCreType.DisplayMember = "SchemeName"; this.cmbCreType.ValueMember = "SchemeNo"; this.cmbCreType.DataSource = schemeList; if (schemeList != null && schemeList.Count > 0) { schemeNo = schemeList[0].SchemeNo; minMoney = schemeList[0].MinAmount; maxMoney = schemeList[0].MaxAmount; this.monyRlabelX.Text = string.Format(LangProxy.ToLang("充值范围{0}-{1}"), schemeList[0].MinAmount, schemeList[0].MaxAmount == 0 ? LangProxy.ToLang("不限制") : (schemeList[0].MaxAmount + ""));//提示充值范围 //加载默认值 CardRechargeSchemeListResponse response1 = schemeList.Find(x => x.SchemeNo.Equals(schemeNo)); //金额赠送明细 listDetail = response1.Detail; //礼品赠送列表 listGift = response1.Gift; //卡券赠送列表 listCoupon = response1.Coupon; //充值金额赠送方案 resetPlanDetail(); //初始化充值金额 InitlizeOtherPayItem(response1.Tgs); } this.cmbCreType.SelectedIndexChanged += OnPalnSelectedIndexChanged; } else { ShowMessage(this.lblInfo, LangProxy.ToLang("获取充值方案异常"), true); } } catch (Exception ex) { ShowMessage(this.lblInfo, LangProxy.ToLang("获取充值方案异常"), true); LOGGER.Error(ex, "获取充值方案异常"); } } } private void OnPalnSelectedIndexChanged(object sender, EventArgs e) { var obj = sender as ComboBoxEx; schemeNo = StringUtils.GetString(obj.SelectedValue); CardRechargeSchemeListResponse response = schemeList.Find(x => x.SchemeNo.Equals(schemeNo)); minMoney = response.MinAmount; maxMoney = response.MaxAmount; this.monyRlabelX.Text = string.Format(LangProxy.ToLang("充值范围{0}-{1}"), response.MinAmount, response.MaxAmount == 0 ? LangProxy.ToLang("不限制" ): (response.MaxAmount + ""));//提示充值范围 //金额赠送明细 listDetail = response.Detail; //礼品赠送列表 listGift = response.Gift; //卡券赠送列表 listCoupon = response.Coupon; //充值金额赠送方案 resetPlanDetail(); //初始化充值金额 InitlizeOtherPayItem(response.Tgs); if (response.InputFlag.Equals("1")) { this.txtMoney.Enabled = false; } else { this.txtMoney.Enabled = true; } } private void OnGiftSelectedIndexChanged(object sender, EventArgs e) { var obj = sender as ComboBoxEx; giftDetailId = StringUtils.GetString(obj.SelectedValue); } private void OnCouponSelectedIndexChanged(object sender, EventArgs e) { var obj = sender as ComboBoxEx; couponDetailId = StringUtils.GetString(obj.SelectedValue); } private void onNumTextChange(object sender, Component.EnterEventArg e) { resetPlanDetail(); } public void resetPlanDetail() { //第一步匹配金额 decimal money = StringUtils.GetDecimal(this.txtMoney.Text); decimal giveAmout = 0.00M; decimal giveJifen = 0.00M; giftDetailId = null;//礼品赠送ID couponDetailId = null;//卡券赠送ID if (listDetail != null) { CardRechargeSchemeDetail schemeDetail = listDetail.OrderByDescending(i => i.StartAmount).ToList().Find(x => x.StartAmount <= money); if (schemeDetail != null) { int giftAmountType = schemeDetail.GiftAmountType; if (giftAmountType == 0) { giveAmout = money * (schemeDetail.GiftAmountValue / 100); } else { giveAmout = schemeDetail.GiftAmountValue;//赠送金额 } int giftPointType = schemeDetail.GiftPointType; if (giftPointType == 0) { giveJifen = money * (schemeDetail.GiftPointValue / 100); } else { giveJifen = schemeDetail.GiftPointValue;//赠送积分 } } } this.giveAmoutTextBox.Text = StringUtils.GetString(giveAmout);//赠送余额 this.giveJifenTextBox.Text = StringUtils.GetString(giveJifen);//赠送积分 this.afterAmountTextBox.Text = StringUtils.GetString(money + giveAmout + StringUtils.GetDecimal(this.preAmountTextBox.Text));//充值后积分 this.afterJifenTextBox.Text = StringUtils.GetString(giveJifen + StringUtils.GetDecimal(this.perJifenTextBox.Text));//充值后积分 //第二部匹配赠送的礼品 if (listGift != null) { List listGift_temp = listGift.OrderByDescending(i => i.StartAmount).ToList().FindAll(x => x.StartAmount <= money); this.comboBoxGif.DisplayMember = string.Format("DisPlayName"); this.comboBoxGif.ValueMember = "Id"; this.comboBoxGif.DataSource = listGift_temp; this.comboBoxGif.SelectedIndexChanged += OnGiftSelectedIndexChanged; } //第三步匹配赠送的电子券 if (listCoupon != null) { List listCoupon_temp = listCoupon.OrderByDescending(i => i.StartAmount).ToList().FindAll(x => x.StartAmount <= money); this.comboBoxCoupon.DisplayMember = string.Format("DisPlayName"); this.comboBoxCoupon.ValueMember = "Id"; this.comboBoxCoupon.DataSource = listCoupon_temp; this.comboBoxCoupon.SelectedIndexChanged += OnCouponSelectedIndexChanged; } } /// /// 初始化tags /// private void InitlizeOtherPayItem(string tags) { this.itemPanelTag.Items.Clear(); //获取Tag标签 if (tags == null || "".Equals(tags)) { tags = "20,50,100,200,500"; } string[] tag = tags.Split(','); ItemContainer ic = new ItemContainer(); ic.MultiLine = true; foreach (var str in tag) { MetroTileItem template = new MetroTileItem(); template.Checked = false; template.CheckBehavior = eMetroTileCheckBehavior.LeftMouseButtonClick; template.OptionGroup = "otherPayGroup"; template.TileSize = new Size(90, 62); template.TileColor = eMetroTileColor.Default; template.TileStyle.TextAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center; template.TileStyle.TextLineAlignment = DevComponents.DotNetBar.eStyleTextAlignment.Center; template.TitleTextAlignment = System.Drawing.ContentAlignment.TopCenter; template.EnableMarkup = true; if (template.Checked) { template.TileColor = eMetroTileColor.Default; } template.DisabledBackColor = SystemColors.ControlDarkDark; //绑定Tag template.Tag = str; template.Text = str; template.Symbol = "¥"; template.CheckedChanged += (o, args) => { MetroTileItem item = (MetroTileItem)o; item.TileColor = item.Checked ? eMetroTileColor.Default : eMetroTileColor.Default; }; template.MouseDown += OnNumItemClick; ic.SubItems.Add(template); } this.itemPanelTag.Items.Add(ic); this.itemPanelTag.Invalidate(); } private void OnNumItemClick(object sender, EventArgs e) { if (sender is MetroTileItem) { var obj = sender as MetroTileItem; var indexT = obj.Tag as string; this.txtMoney.Text = indexT; } } public void saveCardRecharge(CardRecharge entity) { try { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { //如果门店充值单号已存在删除原来的单号 string deleteSql = "delete from pos_card_recharge where rechargeNo = '{0}'"; string deleteDetailSql = "delete from pos_card_recharge_pay where voucherNo = '{0}'"; deleteSql = string.Format(deleteSql, entity.RechargeNo); deleteDetailSql = string.Format(deleteDetailSql, entity.RechargeNo); db.Execute(deleteSql); db.Execute(deleteDetailSql); logger.Info("单号:[{0}]保存充值订单......开始", entity.RechargeNo); // 保存主单数据 db.Save(entity); // 保存支付明细 List detail = entity.Detail; if (detail != null && detail.Count > 0) { foreach (CardRechargeDetail detailEntity in detail) { StringBuilder ticket_detailSql = new StringBuilder(); db.Save(detailEntity); } } transaction.Complete(); logger.Info("单号:[{0}]保存充值订单......成功", entity.RechargeNo); } } } } catch (Exception ex) { LOGGER.Error(ex); } } public void updateCardRecharge(string rechargeNo, int payStatus, int rechargeStatus) { try { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { string sqlQuery = "select * from pos_card_recharge where rechargeNo = '{0}'"; sqlQuery = string.Format(sqlQuery, rechargeNo); List rechargeLsit = db.Query(sqlQuery).ToList(); if (rechargeLsit != null && rechargeLsit.Count > 0) { CardRechargeEntity cardRechargeEntity = rechargeLsit[0]; if (cardRechargeEntity.PayStatus == 2 && cardRechargeEntity.RechargeStatus == 2) { logger.Info("单号:[{0}]充值发生异常,发起了重复充值", rechargeNo); return; } } using (var transaction = db.GetTransaction()) { logger.Info("单号:[{0}]更改订单状态 payStatus==>{1},rechargeStatus==>{2}......开始", rechargeNo, payStatus, rechargeStatus); string sql = "update pos_card_recharge set payStatus ={0} ,rechargeStatus ={1} where rechargeNo = '{2}'"; sql = string.Format(sql, payStatus, rechargeStatus, rechargeNo); db.Execute(sql, null); string sql_pay = "update pos_card_recharge_pay set payNo ='{0}' ,payName ='{1}' where voucherNo = '{2}'"; sql_pay = string.Format(sql_pay, payTypeNo, payTypeName, rechargeNo); db.Execute(sql_pay, null); transaction.Complete(); logger.Info("单号:[{0}]更改订单状态 payStatus==>{1},rechargeStatus==>{2}......成功", rechargeNo, payStatus, rechargeStatus); } } } } catch (Exception ex) { LOGGER.Error(ex); } } public void deleteCardRechargeTemp() { try { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { string sql = "delete from pos_card_recharge_pay where rechargeId in(select id from pos_card_recharge where payStatus =1 and rechargeStatus =1)"; db.Execute(sql, null); sql = "delete from pos_card_recharge where payStatus =1 and rechargeStatus =1"; db.Execute(sql, null); transaction.Complete(); logger.Info("删除支付取消的临时数据"); } } } } catch (Exception ex) { LOGGER.Error(ex); } } private void btn_ReCharge(object sender, EventArgs e) { if (isPayUnRecharge) { //尝试重新发起充值请求 Recharge(this.routTradeNo, rmoney); return; } if (isRecharge) { ShowMessage(this.lblInfo, LangProxy.ToLang("正在为你进行充值操作"), true); return; } isRecharge = true; decimal money = StringUtils.GetDecimal(this.txtMoney.Text); if (cardNo == null || "".Equals(cardNo)) { ShowMessage(this.lblInfo, LangProxy.ToLang("请输入先获取卡号"), true); isRecharge = false; return; } if (schemeNo == null || "".Equals(schemeNo)) { ShowMessage(this.lblInfo, LangProxy.ToLang("请选择充值方案"), true); isRecharge = false; return; } if (money <= 0) { ShowMessage(this.lblInfo, LangProxy.ToLang("请输入充值金额"), true); isRecharge = false; return; } if ("".Equals(payTypeNo)) { ShowMessage(this.lblInfo, LangProxy.ToLang("请选择支付方式"), true); isRecharge = false; return; } if (money < minMoney) { ShowMessage(this.lblInfo, LangProxy.ToLang("充值金额不合法"), true); isRecharge = false; return; } if (maxMoney > 0 && money > maxMoney) { ShowMessage(this.lblInfo, LangProxy.ToLang("充值金额不合法"), true); isRecharge = false; return; } ShowMessage(this.lblInfo, LangProxy.ToLang("正在充值"), true); deleteCardRechargeTemp(); //第一步,发起充值 //发起本地请求之前先记录充值记录,防止扫码支付成功充值失败以后单据找不到的问题 CardRecharge entity = new CardRecharge(); entity.Amount = money + StringUtils.GetDecimal(this.giveAmoutTextBox.Text); entity.CardNo = cardNo; entity.CouponId = couponDetailId; entity.CouponNum = 0.00M; entity.GiftId = giftDetailId; entity.GiftNum = 0.00M; entity.GiveMoney = StringUtils.GetDecimal(this.giveAmoutTextBox.Text); entity.GivePoint = StringUtils.GetDecimal(this.giveJifenTextBox.Text); entity.Id = IdWorkerUtils.Instance.NextId(); entity.Money = money; entity.PlanName = Global.Instance.BusinessPlanLog.Name; entity.PlanNo = Global.Instance.BusinessPlanLog.No; entity.PosNo = Global.Instance.Authc.PosNo; entity.RechargeNo = this.outTradeNo; entity.StoreId = Global.Instance.BusinessPlanLog.StoreId; entity.StoreName = Global.Instance.Authc.StoreName; entity.StoreNo = Global.Instance.BusinessPlanLog.StoreNo; entity.TenantId = Global.Instance.BusinessPlanLog.TenantId; entity.WorkerId = Global.Instance.BusinessPlanLog.WorkerId; entity.WorkerName = Global.Instance.BusinessPlanLog.WorkerName; entity.WorkerNo = Global.Instance.BusinessPlanLog.WorkerNo; entity.PayStatus = 1;//未付款 entity.RechargeStatus = 1;//未充值 List detail = new List(); CardRechargeDetail cardRechargeDetail = new CardRechargeDetail(); cardRechargeDetail.Amount = money; cardRechargeDetail.PayName = payTypeName; cardRechargeDetail.PayNo = payTypeNo; cardRechargeDetail.RechargeId = entity.Id; cardRechargeDetail.TenantId = Global.Instance.BusinessPlanLog.TenantId; cardRechargeDetail.VoucherNo = this.outTradeNo; cardRechargeDetail.Id = IdWorkerUtils.Instance.NextId(); detail.Add(cardRechargeDetail); entity.Detail = detail; entity.RequestMessage = null; var request = new CardRechargeRequest(); request.CardNo = cardNo; request.Amount = (int)(money * 100); request.SchemeNo = schemeNo; if (giftDetailId != null) { request.GiftSign = "1"; } else { request.GiftSign = "0"; } request.GiftDetailId = giftDetailId; if (couponDetailId != null) { request.CouponSign = "1"; } else { request.CouponSign = "0"; } request.CouponDetailId = couponDetailId; request.PayType = payTypeName; request.PayTypeNo = payTypeNo; request.PayVoucherNo = this.outTradeNo; request.ShopNo = Global.Instance.Authc.StoreNo; request.PosNo = Global.Instance.Authc.PosNo; request.WorkerNo = Global.Instance.Worker.No; request.SourceSign = "pos"; request.MemberName = lblMemerName.Text; request.MemberPhone = lblMemeberMobile.Text; request.MemberType = ""; request.CardType = cardTypeName; request.Memo = descriptionTextBox.Text; string data = JsonUtils.Serialize(request); entity.RequestMessage = data; saveCardRecharge(entity); if ("04".Equals(payTypeNo) || "05".Equals(payTypeNo) || "07".Equals(payTypeNo)) { //如果选择支付宝或者微信,先去扣钱 var form = new CardRechargeSaomaForm(cardNo, money, this.outTradeNo); form.OnSaomaResultClick += Form_OnSaomaResultClick; TransparentForm trans = new TransparentForm(this,0.5, form); trans.Show(this); return; } else { Recharge(this.outTradeNo, money); } } public void Recharge(string voucherNo, decimal money) { if (isPayUnRecharge) { logger.Info("支付成功,重新发起充值请求,凭证号[{0}]......", voucherNo); } else { logger.Info("发起充值请求,凭证号[{0}]......", voucherNo); } try { using (var db = Global.Instance.OpenDataBase) { string sql = "select * from pos_card_recharge where rechargeNo = '{0}'"; sql = string.Format(sql, voucherNo); CardRecharge cardRecharge = db.FirstOrDefault(sql); if (cardRecharge == null) { this.ShowToastNotify(this, LangProxy.ToLang("获取充值单据数据失败!")); return; } var request = JsonUtils.Deserialize(cardRecharge.RequestMessage); request.PayTypeNo = this.payTypeNo; request.PayType = this.payTypeName; var response = CardUtils.CardRecharge(request); int RechargeStatus = response.Item1 ? 2 : 3; updateCardRecharge(voucherNo, 2, RechargeStatus); //成功 if (response.Item1) { isPayUnRecharge = false; this.routTradeNo = null; rmoney = 0.00M; logger.Info("充值成功,凭证号[{0}]......", voucherNo); ShowMessage(this.lblInfo, response.Item2, false); //清空充值金额 this.txtMoney.Text = "0"; //打印充值结果 logger.Info("充值成功打印,凭证号[{0}]......", voucherNo); this.ShowToastNotify(this, LangProxy.ToLang("开始打印")); //如果有卡面号构建卡面号的打印 if (faceNo != null && !"".Equals(faceNo)) { response.Item3.Data.CardNo = faceNo; } //构建收银小票模版参数打印 var vars = CardHelper.BuilderRechargeVariable(request, response.Item3.Data); //现金充值开钱箱 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 CardRechargeResultForm(request, response.Item3.Data); form.ShowDialog(); //先关闭父窗体 if (this.Owner != null) { this.Owner.Close(); } //再关闭当前窗体 this.Close(); } else { //对于支付成功,充值失败的可以进行重试 isPayUnRecharge = true; this.routTradeNo = voucherNo; rmoney = money; ShowMessage(this.lblInfo, response.Item2, true); } isRecharge = false; } } catch (Exception ex) { LOGGER.Error(ex); } } private void Form_OnSaomaResultClick(CardRechargeSaomaEventArgs e) { Tuple saomaResult = e.SaomaResult; using (var _db = Global.Instance.OpenDataBase) { var _data = _db.FirstOrDefault(string.Format("where orderNo = '{0}'", saomaResult.Item2.OutTradeNo)); if (_data != null) { if (_data.PayStatus == 1) { OnCloseTouchClick(null, null); return; } } } int PayStatus = saomaResult.Item1 ? 2 : 3; if (saomaResult.Item2.Type == 0) { updateCardRecharge(saomaResult.Item2.OutTradeNo, PayStatus, 1); } //如果支付成功则进行充值 if (saomaResult.Item1) { isRecharge = false; //扫描支付状态0支付1核销 if (saomaResult.Item2.Type == 0) { payTypeNo = saomaResult.Item2.PayModeNo; payTypeName = saomaResult.Item2.PayModeName; 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); } Recharge(saomaResult.Item2.OutTradeNo, saomaResult.Item2.PayMoney); } else { //先关闭父窗体 if (this.Owner != null) { this.Owner.Close(); } //再关闭当前窗体 this.Close(); } } else { isRecharge = false; } } 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 Btn_RechargeLog(object sender, EventArgs e) { var form = new CardRechargeLogForm(); form.ShowDialog(); } } }