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.

1084 lines
43 KiB
C#

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<CardRechargeSchemeListResponse> 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<CardRechargeSchemeDetail> listDetail = null;
//礼品赠送列表
List<CardRechargeSchemeGift> listGift = null;
//卡券赠送列表
List<CardRechargeSchemeCoupon> listCoupon = null;
private List<PayMode> payTypeList = new List<PayMode>();
//充值单号
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<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 = 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;
}
}
}
/// <summary>
/// 输入是否验证通过
/// </summary>
private bool InputVerify()
{
if (string.IsNullOrEmpty(this.txtInput.Text.Trim()))
{
ShowMessage(this.lblInfo, "请输入卡号信息", false);
return false;
}
return true;
}
/// <summary>
/// 会员卡信息
/// </summary>
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<MemberCard> 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<MemberCard> list = new List<MemberCard>();
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<CardRechargeSchemeGift> 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<CardRechargeSchemeCoupon> 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;
}
}
/// <summary>
/// 初始化tags
/// </summary>
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<CardRecharge>(entity);
// 保存支付明细
List<CardRechargeDetail> detail = entity.Detail;
if (detail != null && detail.Count > 0)
{
foreach (CardRechargeDetail detailEntity in detail)
{
StringBuilder ticket_detailSql = new StringBuilder();
db.Save<CardRechargeDetail>(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<CardRechargeEntity> rechargeLsit = db.Query<CardRechargeEntity>(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<CardRechargeDetail> detail = new List<CardRechargeDetail>();
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<CardRecharge>(sql);
if (cardRecharge == null)
{
this.ShowToastNotify(this, LangProxy.ToLang("获取充值单据数据失败!"));
return;
}
var request = JsonUtils.Deserialize<CardRechargeRequest>(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<bool, string> 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<bool, CardSaomaResult> saomaResult = e.SaomaResult;
using (var _db = Global.Instance.OpenDataBase)
{
var _data = _db.FirstOrDefault<SaomaPayTicket>(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();
}
}
}