|
|
|
|
using DevComponents.DotNetBar.Controls;
|
|
|
|
|
using POSV.Bean;
|
|
|
|
|
using POSV.Card;
|
|
|
|
|
using POSV.Entity;
|
|
|
|
|
using POSV.Helper;
|
|
|
|
|
using POSV.Proxy.Member.Recharge;
|
|
|
|
|
using POSV.Rechargefree;
|
|
|
|
|
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.Windows.Forms;
|
|
|
|
|
|
|
|
|
|
namespace POSV.Member
|
|
|
|
|
{
|
|
|
|
|
public partial class CardRechargeFreeFrom : BusinessForm
|
|
|
|
|
{
|
|
|
|
|
public CardRechargeFreeFrom()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
}
|
|
|
|
|
private string payTypeNo = "";
|
|
|
|
|
private string payTypeName = "请选择支付方式";
|
|
|
|
|
private string schemeNo = null;//充值方案编号
|
|
|
|
|
private string giftDetailId = null;//礼品赠送ID
|
|
|
|
|
private string couponDetailId = null;//卡券赠送ID
|
|
|
|
|
private decimal minMoney = 0.00M;
|
|
|
|
|
private decimal maxMoney = 0.00M;
|
|
|
|
|
private string MemberTypeNo = "";
|
|
|
|
|
private bool isPayUnRecharge = false;//支付成功但是充值失败
|
|
|
|
|
private string routTradeNo = "";//尝试重试的单号
|
|
|
|
|
private decimal rmoney = 0.00M;//尝试重试的金额
|
|
|
|
|
private decimal giftAmount = 0.00M;
|
|
|
|
|
private decimal giftPoint = 0.00M;
|
|
|
|
|
private bool isRecharge = false;
|
|
|
|
|
private string cardNo = null;
|
|
|
|
|
private string faceNo = null;
|
|
|
|
|
private string outTradeNo = "";
|
|
|
|
|
public string cardTypeName = null;
|
|
|
|
|
|
|
|
|
|
private RechargeSchemeFreeResponse rechargeSchemeFree = new RechargeSchemeFreeResponse();
|
|
|
|
|
private MemberInfoQueryResponse member = null;
|
|
|
|
|
private List<CardRechargeSchemeListResponse> schemeList = null;
|
|
|
|
|
private List<PayMode> payTypeList = new List<PayMode>();
|
|
|
|
|
//金额赠送明细
|
|
|
|
|
List<CardRechargeSchemeDetail> listDetail = null;
|
|
|
|
|
//礼品赠送列表
|
|
|
|
|
List<CardRechargeSchemeGift> listGift = null;
|
|
|
|
|
//卡券赠送列表
|
|
|
|
|
List<CardRechargeSchemeCoupon> listCoupon = null;
|
|
|
|
|
|
|
|
|
|
private CustomRechargeProxy _proxy = new CustomRechargeProxy();
|
|
|
|
|
|
|
|
|
|
protected override void OnLoad(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnLoad(e);
|
|
|
|
|
this.InitPayType();
|
|
|
|
|
|
|
|
|
|
this.outTradeNo = string.Format("{0}_{1}{2}", Global.Instance.Authc.StoreNo, Global.Instance.Authc.PosNo, DateTime.Now.ToString("yyyyMMddHHmmss"));
|
|
|
|
|
}
|
|
|
|
|
private void txtInput_ButtonCustomClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var result = CardOperateUtils.Instance.ReadCardNo();
|
|
|
|
|
|
|
|
|
|
if (result.Item1)
|
|
|
|
|
{
|
|
|
|
|
this.txtInput.Text = result.Item2;
|
|
|
|
|
this.buttonX3_Click(null, null);
|
|
|
|
|
//读卡成功,模拟回车事件
|
|
|
|
|
//InputSimulatorUtils.SendKey(KeyCodes.Map["return"]);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result = CardOperateUtilsOther.Instance.ReadCardNo();
|
|
|
|
|
if (result.Item1)
|
|
|
|
|
{
|
|
|
|
|
this.txtInput.Text = result.Item2;
|
|
|
|
|
this.buttonX3_Click(null, null);
|
|
|
|
|
//读卡成功,模拟回车事件
|
|
|
|
|
//InputSimulatorUtils.SendKey(KeyCodes.Map["return"]);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.ShowMessage(lblInfo, result.Item2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void buttonX3_Click(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, "无法识别的卡号,请确认", 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;
|
|
|
|
|
this.cardNo = memberInfoQueryResponse.CardList.FirstOrDefault()?.CardNo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.member = memberInfoQueryResponse;
|
|
|
|
|
this.MemberTypeNo = memberInfoQueryResponse.MemberTypeNo;
|
|
|
|
|
this.InitCmbCreType();
|
|
|
|
|
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;
|
|
|
|
|
this.lblpreAmount.Text = memberInfoQueryResponse.CardList.FirstOrDefault().AvailableAmount.ToString();
|
|
|
|
|
this.lblpreJifen.Text = memberInfoQueryResponse.CardList.FirstOrDefault().TotalPoint.ToString();
|
|
|
|
|
|
|
|
|
|
this.txtPresented.Text = " ";
|
|
|
|
|
this.txtGiftPoint.Text = " ";
|
|
|
|
|
this.txtMoney.Text = " ";
|
|
|
|
|
this.txtPresented.Text = "";
|
|
|
|
|
this.txtGiftPoint.Text = "";
|
|
|
|
|
this.txtMoney.Text = "";
|
|
|
|
|
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 InitCmbCreType()
|
|
|
|
|
{
|
|
|
|
|
//var _data = _proxy.RechargeSchemeLis(MemberTypeNo);
|
|
|
|
|
RechargeSchemeFreeRequest request = new RechargeSchemeFreeRequest();
|
|
|
|
|
|
|
|
|
|
request.CardTypeId = member.CardList.FirstOrDefault().CardTypeId;
|
|
|
|
|
request.PosNo = Global.Instance.BusinessPlanLog.PosNo;
|
|
|
|
|
request.ShopNo = Global.Instance.BusinessPlanLog.StoreNo;
|
|
|
|
|
|
|
|
|
|
var _data = _proxy.RechargeSchemeLis(request);
|
|
|
|
|
if (_data.Code == Proxy.Common.ReturnState.Failed)
|
|
|
|
|
{
|
|
|
|
|
this.ShowToastNotify(this, _data.ErrorMessage);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
rechargeSchemeFree = _data.Data;
|
|
|
|
|
|
|
|
|
|
this.txtMoney.WatermarkText = "";
|
|
|
|
|
this.txtPresented.WatermarkText = "赠送金额范围 0 ~ " + rechargeSchemeFree.MaxGiftAmountValue;
|
|
|
|
|
|
|
|
|
|
this.txtGiftPoint.WatermarkText = "赠送积分范围 0 ~ " + rechargeSchemeFree.MaxGiftPointValue;
|
|
|
|
|
|
|
|
|
|
//if (_data.Code == Proxy.Common.ReturnState.Failed)
|
|
|
|
|
//{
|
|
|
|
|
// this.ShowToastNotify(this, "充值方案" + _data.ErrorMessage);
|
|
|
|
|
// return;
|
|
|
|
|
//}
|
|
|
|
|
//this.cmbCreType.DisplayMember = "SchemeName";
|
|
|
|
|
//this.cmbCreType.ValueMember = "SchemeNo";
|
|
|
|
|
//schemeList = _data.Data;
|
|
|
|
|
//this.cmbCreType.DataSource = _data.Data;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 = "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void buttonX1_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (isPayUnRecharge)
|
|
|
|
|
{
|
|
|
|
|
//尝试重新发起充值请求
|
|
|
|
|
Recharge(this.routTradeNo, rmoney, giftAmount, giftPoint);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (isRecharge)
|
|
|
|
|
{
|
|
|
|
|
ShowMessage(this.lblInfo, "正在为你进行充值操作", true);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
isRecharge = true;
|
|
|
|
|
|
|
|
|
|
decimal money = StringUtils.GetDecimal(this.txtMoney.Text);
|
|
|
|
|
|
|
|
|
|
if (cardNo == null || "".Equals(cardNo))
|
|
|
|
|
{
|
|
|
|
|
ShowMessage(this.lblInfo, "请输入先获取卡号", true);
|
|
|
|
|
isRecharge = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (rechargeSchemeFree?.SchemeNo == null || "".Equals(rechargeSchemeFree?.SchemeNo))
|
|
|
|
|
{
|
|
|
|
|
ShowMessage(this.lblInfo, "请选择充值方案", true);
|
|
|
|
|
isRecharge = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//if (money <= 0)
|
|
|
|
|
//{
|
|
|
|
|
// ShowMessage(this.lblInfo, "请输入充值金额", true);
|
|
|
|
|
// isRecharge = false;
|
|
|
|
|
// return;
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
if ("".Equals(payTypeNo))
|
|
|
|
|
{
|
|
|
|
|
ShowMessage(this.lblInfo, "请选择支付方式", true);
|
|
|
|
|
isRecharge = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (money < minMoney)
|
|
|
|
|
{
|
|
|
|
|
ShowMessage(this.lblInfo, "充值金额不合法", true);
|
|
|
|
|
isRecharge = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (maxMoney > 0 && money > maxMoney)
|
|
|
|
|
{
|
|
|
|
|
ShowMessage(this.lblInfo, "充值金额不合法", true);
|
|
|
|
|
isRecharge = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ShowMessage(this.lblInfo, "正在充值", true);
|
|
|
|
|
deleteCardRechargeTemp();
|
|
|
|
|
|
|
|
|
|
//第一步,发起充值
|
|
|
|
|
//发起本地请求之前先记录充值记录,防止扫码支付成功充值失败以后单据找不到的问题
|
|
|
|
|
CardRecharge entity = new CardRecharge();
|
|
|
|
|
entity.Amount = money + StringUtils.GetDecimal(this.txtPresented.Text);
|
|
|
|
|
entity.CardNo = cardNo;
|
|
|
|
|
entity.CouponId = couponDetailId;
|
|
|
|
|
entity.CouponNum = 0.00M;
|
|
|
|
|
entity.GiftId = giftDetailId;
|
|
|
|
|
entity.GiftNum = 0.00M;
|
|
|
|
|
entity.GiveMoney = StringUtils.GetDecimal(this.txtPresented.Text);
|
|
|
|
|
entity.GivePoint = string.IsNullOrEmpty(this.txtGiftPoint.Text) ? 0 : decimal.Parse(this.txtGiftPoint.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 = rechargeSchemeFree?.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 = "";
|
|
|
|
|
string data = JsonUtils.Serialize(request);
|
|
|
|
|
entity.RequestMessage = data;
|
|
|
|
|
saveCardRecharge(entity);
|
|
|
|
|
this.giftPoint = entity.GivePoint;
|
|
|
|
|
this.giftAmount = entity.GiveMoney;
|
|
|
|
|
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, form);
|
|
|
|
|
trans.Show(this);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Recharge(this.outTradeNo, money, entity.GiveMoney, entity.GivePoint);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
controlBox_CloseClick(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, this.giftAmount, this.giftPoint);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
//先关闭父窗体
|
|
|
|
|
if (this.Owner != null)
|
|
|
|
|
{
|
|
|
|
|
this.Owner.Close();
|
|
|
|
|
}
|
|
|
|
|
//再关闭当前窗体
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
isRecharge = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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 Recharge(string voucherNo, decimal money, decimal giftAmount, decimal giftPoint)
|
|
|
|
|
{
|
|
|
|
|
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, "获取充值单据数据失败!");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//var request = JsonUtils.Deserialize<CardRechargeRequest>(cardRecharge.RequestMessage);
|
|
|
|
|
//request.PayTypeNo = this.payTypeNo;
|
|
|
|
|
//request.PayType = this.payTypeName;
|
|
|
|
|
//var response = CardUtils.CardRecharge(request);
|
|
|
|
|
RechargeFreeRequest request = new RechargeFreeRequest();
|
|
|
|
|
request.CardNo = this.cardNo;
|
|
|
|
|
request.Amount = (int)(money * 100);
|
|
|
|
|
request.GiftAmount = (int)(giftAmount * 100);
|
|
|
|
|
request.GiftPoint = (int)(giftPoint * 100);
|
|
|
|
|
request.PayType = this.payTypeName;
|
|
|
|
|
request.PayVoucherNo = "";
|
|
|
|
|
request.PosNo = Global.Instance.BusinessPlanLog.PosNo;
|
|
|
|
|
request.SchemeId = rechargeSchemeFree?.SchemeId;
|
|
|
|
|
request.ShopNo = Global.Instance.BusinessPlanLog.StoreNo;
|
|
|
|
|
request.WorkerNo = Global.Instance.Worker.No;
|
|
|
|
|
var _response = _proxy.Recharge(request);
|
|
|
|
|
int RechargeStatus = _response.Code == Proxy.Common.ReturnState.Succeed ? 2 : 3;
|
|
|
|
|
updateCardRecharge(voucherNo, 2, RechargeStatus);
|
|
|
|
|
//成功
|
|
|
|
|
if (_response.Code == Proxy.Common.ReturnState.Succeed)
|
|
|
|
|
{
|
|
|
|
|
isPayUnRecharge = false;
|
|
|
|
|
this.routTradeNo = null;
|
|
|
|
|
rmoney = 0.00M;
|
|
|
|
|
LOGGER.Info("充值成功,凭证号[{0}]......", voucherNo);
|
|
|
|
|
ShowMessage(this.lblInfo, "充值成功", false);
|
|
|
|
|
//打印充值结果
|
|
|
|
|
LOGGER.Info("充值成功打印,凭证号[{0}]......", voucherNo);
|
|
|
|
|
this.ShowToastNotify(this, "开始打印");
|
|
|
|
|
//如果有卡面号构建卡面号的打印
|
|
|
|
|
if (faceNo != null && !"".Equals(faceNo))
|
|
|
|
|
{
|
|
|
|
|
_response.Data.CardNo = faceNo;
|
|
|
|
|
}
|
|
|
|
|
//构建收银小票模版参数打印
|
|
|
|
|
|
|
|
|
|
var vars = CardHelper.BuilderRechargeVariable(member, _response.Data, this.payTypeName);
|
|
|
|
|
|
|
|
|
|
//现金充值开钱箱
|
|
|
|
|
bool openCashbox = false;
|
|
|
|
|
if ("01".Equals(this.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 _str = string.Format("充值前金额:{0}\t\n" +
|
|
|
|
|
"充值后余额:{4}\t\n" +
|
|
|
|
|
"充值前积分:{1}\t\n" +
|
|
|
|
|
"充值后积分:{5}", this.lblpreAmount.Text, this.lblpreJifen.Text, this.lblgiveAmout.Text, this.lblgiveJifen.Text, this.lblafterAmount.Text, this.lblafterJifen.Text);
|
|
|
|
|
|
|
|
|
|
DialogForm dialog = new DialogForm("操作提醒", _str, MessageBoxIcon.Warning, MessageBoxButtons.OK);
|
|
|
|
|
dialog.ShowDialog();
|
|
|
|
|
|
|
|
|
|
//先关闭父窗体
|
|
|
|
|
if (this.Owner != null)
|
|
|
|
|
{
|
|
|
|
|
this.Owner.Close();
|
|
|
|
|
}
|
|
|
|
|
//再关闭当前窗体
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//对于支付成功,充值失败的可以进行重试
|
|
|
|
|
isPayUnRecharge = true;
|
|
|
|
|
this.routTradeNo = voucherNo;
|
|
|
|
|
rmoney = money;
|
|
|
|
|
ShowMessage(this.lblInfo, _response.ErrorMessage, true);
|
|
|
|
|
}
|
|
|
|
|
isRecharge = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void cmbCreType_SelectedIndexChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var obj = sender as ComboBoxEx;
|
|
|
|
|
schemeNo = StringUtils.GetString(obj.SelectedValue);
|
|
|
|
|
CardRechargeSchemeListResponse response = schemeList.Find(x => x.SchemeNo.Equals(rechargeSchemeFree?.SchemeNo));
|
|
|
|
|
minMoney = response.MinAmount;
|
|
|
|
|
maxMoney = response.MaxAmount;
|
|
|
|
|
|
|
|
|
|
//金额赠送明细
|
|
|
|
|
listDetail = response.Detail;
|
|
|
|
|
//礼品赠送列表
|
|
|
|
|
listGift = response.Gift;
|
|
|
|
|
//卡券赠送列表
|
|
|
|
|
listCoupon = response.Coupon;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void controlBox_CloseClick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.Owner?.Close();
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void txtMoney_OnValueChanged(object sender, Component.EnterEventArg e)
|
|
|
|
|
{
|
|
|
|
|
var _money = 0.00M;
|
|
|
|
|
var _presented = 0.00M;
|
|
|
|
|
|
|
|
|
|
decimal.TryParse(this.txtMoney.Text, out _money);
|
|
|
|
|
decimal.TryParse(this.txtPresented.Text, out _presented);
|
|
|
|
|
|
|
|
|
|
this.lblafterAmount.Text = (decimal.Parse(this.lblpreAmount.Text) + _presented + _money).ToString();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void txtPresented_OnValueChanged(object sender, Component.EnterEventArg e)
|
|
|
|
|
{
|
|
|
|
|
var _money = 0.00M;
|
|
|
|
|
var _presented = 0.00M;
|
|
|
|
|
|
|
|
|
|
decimal.TryParse(this.txtMoney.Text, out _money);
|
|
|
|
|
decimal.TryParse(this.txtPresented.Text, out _presented);
|
|
|
|
|
if (rechargeSchemeFree.MaxGiftAmountValue < _presented)
|
|
|
|
|
{
|
|
|
|
|
this.txtPresented.Text = rechargeSchemeFree.MaxGiftAmountValue.ToString();
|
|
|
|
|
_presented = rechargeSchemeFree.MaxGiftAmountValue;
|
|
|
|
|
}
|
|
|
|
|
this.lblgiveAmout.Text = _presented.ToString();
|
|
|
|
|
this.lblafterAmount.Text = (decimal.Parse(this.lblpreAmount.Text) + _presented + _money).ToString();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void txtGiftPoint_OnValueChanged(object sender, Component.EnterEventArg e)
|
|
|
|
|
{
|
|
|
|
|
var _point = 0.00M;
|
|
|
|
|
var _preJifen = 0.00M;
|
|
|
|
|
decimal.TryParse(this.txtGiftPoint.Text, out _point);
|
|
|
|
|
decimal.TryParse(this.lblpreJifen.Text, out _preJifen);
|
|
|
|
|
if (rechargeSchemeFree.MaxGiftPointValue < _point)
|
|
|
|
|
{
|
|
|
|
|
this.txtGiftPoint.Text = rechargeSchemeFree.MaxGiftPointValue.ToString();
|
|
|
|
|
_point = rechargeSchemeFree.MaxGiftPointValue;
|
|
|
|
|
}
|
|
|
|
|
this.lblgiveJifen.Text = _point.ToString();
|
|
|
|
|
this.lblafterJifen.Text = (_point + _preJifen).ToString();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void txtInput_OnEnterClick(object sender, Component.EnterEventArg e)
|
|
|
|
|
{
|
|
|
|
|
buttonX3_Click(null, null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|