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.

677 lines
24 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Controls;
using POSV.Bean;
using POSV.Card;
using POSV.Component;
using POSV.Utils;
using POSV.Helper;
using POS.Language.Language;
namespace POSV.Member
{
public partial class CardOpenForm : BusinessForm
{
/// <summary>
/// 会员卡开户响应信息
/// </summary>
private String cardOpenNo;
/// <summary>
/// 会员卡参数配置规则
/// </summary>
private MemberCardItem _currentCardItem = null;
/// <summary>
/// 当前读卡的方式
/// </summary>
private MemberCardReadType _currentReadCardType = MemberCardReadType.;
public CardOpenForm()
{
InitializeComponent();
this.controlBox.WindowMoveClick += OnWindowMoveClick;
this.Text = LangProxy.ToLang("会员卡开户");
this.controlBox.Text = LangProxy.ToLang("会员卡开户");
this.controlBox.ShowApplicationVersion = false;
//半角输入
this.ImeMode = ImeMode.OnHalf;
var _password = Global.Instance.GlobalConfigStringValue(ConfigConstant.CONFIG_CASHIER_PREINSTALLPASSWORD);
if (string.IsNullOrEmpty(_password))
{
return;
}
else
{
this.txtCardPasswd.Text = _password;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SetStyle(ControlStyles.Selectable, true);
//会员卡号
this.txtCardNo.Multiline = false;
this.txtCardNo.Focus();
this.txtCardNo.Select();
//会员规则
this._currentCardItem = JsonUtils.Deserialize<MemberCardItem>(Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_MEMBER_CARD));
//支持的读卡方式,开户环节将手机号和电子卡合并理解为一种介质方式,介质卡为第二种方式
this.panelReadCardType.Visible = (this._currentCardItem.ListReader.Count > 2);
//是否开启多种支付方式
this.radioButtonMobile.Visible = this._currentCardItem.ListReader.Contains(MemberCardReadType.) || this._currentCardItem.ListReader.Contains(MemberCardReadType.);
this.radioButtonCardNo.Visible = this._currentCardItem.ListReader.Contains(MemberCardReadType.IC);
if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_MEMBER_DEFAULTENTITYCARD, false))
{
this._currentCardItem.DefaultType = MemberCardReadType.IC;
}
//不允许手机号开户
if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_MEMBER_NOCELLPHONESALLOWEDOPENANACCOUNT, false))
{
this._currentCardItem.DefaultType = MemberCardReadType.IC;
this.radioButtonMobile.Visible = false;
}
//默认选择的读卡方式
switch (this._currentCardItem.DefaultType)
{
case MemberCardReadType.:
case MemberCardReadType.:
this.radioButtonMobile.Checked = true;
break;
case MemberCardReadType.IC:
this.radioButtonCardNo.Checked = true;
break;
}
//加载证件类型
LoadCreTypeList();
}
private void LoadCreTypeList()
{
Task.Factory.StartNew(() =>
{
var lists = CardUtils.CreTypeList();
return lists;
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception?.GetBaseException(), "加载证件类型异常");
}
else
{
this.Invoke(new Action(() =>
{
var result = task.Result;
if (result.Item1)
{
this.cmbCreType.Items.Clear();
this.cmbCreType.Items.AddRange(result.Item3.ToArray());
this.cmbCreType.SelectedIndex = 0;
}
}));
}
});
}
/// <summary>
/// 输入是否验证通过
/// </summary>
private bool InputVerify()
{
switch (this._currentReadCardType)
{
case MemberCardReadType.:
case MemberCardReadType.:
{
if (string.IsNullOrEmpty(this.txtMobile.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请输入手机号码"), false);
return false;
}
if (!StringUtils.IsMobilePhone(this.txtMobile.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请输入合法的手机号"), false);
return false;
}
if (string.IsNullOrEmpty(this.txtCardNo.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请输入手机号码"), false);
return false;
}
}
break;
case MemberCardReadType.IC:
{
if (!Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_MEMBER_NOCELLPHONENUMBERISALLOWED, false))
{
if (string.IsNullOrEmpty(this.txtMobile.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请输入手机号码"), false);
return false;
}
if (!StringUtils.IsMobilePhone(this.txtMobile.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请输入合法的手机号"), false);
return false;
}
}
if (string.IsNullOrEmpty(this.txtCardNo.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请刷卡或挥卡"), false);
return false;
}
}
break;
}
if (string.IsNullOrEmpty(this.txtCardPasswd.Text.Trim()) || this.txtCardPasswd.Text.Trim().Length != 6)
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请设置六位会员密码"), true);
return false;
}
if (string.IsNullOrEmpty(txtMemberName.Text.Trim() == "" ? "默认开户人" : txtMemberName.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请输入会员姓名"), false);
return false;
}
return true;
}
protected void OnFinishedClick(object sender, EventArgs e)
{
if (!OpenanAccountVerify())
{
return;
}
var isVerify = InputVerify();
if (isVerify)
{
var button = sender as ButtonX;
bool newMember = false;
var property = "mobile";
string realCardNo = txtCardNo.Text.Trim();
switch (this._currentReadCardType)
{
case MemberCardReadType.:
case MemberCardReadType.:
{
property = "mobile";
newMember = NewMemberElecCard();
}
break;
case MemberCardReadType.IC:
{
property = "cardNo";
//判断卡面号还是巨为生成的卡号
var cardWay = CardUtils.JudgeCardWay(Global.Instance.Worker.TenantId, realCardNo);
if (cardWay == MemberCardNoType.)
{
var res = CardUtils.QueryRealCardNo(realCardNo);
if (res.Item1)
{
var data = res.Item3;
realCardNo = data.CardNo;
}
else
{
ShowMessage(this.lblInfo, res.Item2, false);
return;
}
}
newMember = NewMemberCard(realCardNo);
}
break;
}
if (newMember)
{
var request = new MemberInfoQueryRequest();
request.Property = property;
request.Keyword = realCardNo;
request.ShopNo = Global.Instance.Authc.StoreNo;
request.WorkerNo = Global.Instance.Worker.No;
request.PosNo = Global.Instance.Authc.PosNo;
var resp = CardUtils.MemberInfoQuery(request);
//会员卡获取成功
if (resp.Item1)
{
//this.OnAcceptButtonClick(new TransparentEventArgs(TransparentAction.Accept , "accept" , resp.Item3));
//this.OnEscapeClick(this.ButtonCancel , EventArgs.Empty);
//打印开户信息
this.ShowToastNotify(this, LangProxy.ToLang("开始打印"));
string printOpenNo = cardOpenNo;
MemberInfoQueryResponse memberInfoQueryResponse = resp.Item3;
if (memberInfoQueryResponse.CardList != null && memberInfoQueryResponse.CardList.Count > 0)
{
List<MemberCard> nowList = memberInfoQueryResponse.CardList.FindAll(x => cardOpenNo.Equals(x.CardNo));
if (nowList != null && nowList.Count > 0)
{
MemberCard memberCard = nowList[0];
if (!string.IsNullOrEmpty(memberCard.FaceNo))
{
printOpenNo = memberCard.FaceNo;
}
}
}
//构建收银小票模版参数打印
var vars = CardHelper.BuilderCardOpenCardVariable(resp.Item3, printOpenNo);
//卡开户打印份数
int ticketCount = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_OPENCARD_COUNT, 1);
//打印延迟
int delaySecond = Global.Instance.GlobalConfigIntValue(ConfigConstant.PERIPHERAL_CASHIER_CARD_PRINT_DELAY, 1);
Tuple<bool, string> result = CardHelper.PrinterTicket("会员卡开户", vars, true, false, ticketCount, delaySecond);
//打开提示界面
var form = new CardOpenResultForm(memberInfoQueryResponse.Name, cardOpenNo, memberInfoQueryResponse.Mobile, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
form.OnRechargeClick += Form_OnRechargeClick;
form.ShowDialog();
//先关闭父窗体
if (this.Owner != null)
{
this.Owner.Close();
}
//再关闭当前窗体
this.Close();
}
else
{
ShowMessage(this.lblInfo, resp.Item2, false);
}
}
}
}
private void Form_OnRechargeClick(object sender, NotifyEventArgs e)
{
OnRechargeClick?.Invoke(sender, new NotifyEventArgs(NotifyAction.Notify, "memberRecharge", e.Data));
}
/// <summary>
/// 是否允许手机开户验证
/// </summary>
/// <returns></returns>
private bool OpenanAccountVerify()
{
var _OpenanAccount = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_MEMBER_NOCELLPHONESALLOWEDOPENANACCOUNT,false);
if (_OpenanAccount)
{
if (radioButtonMobile.Checked)
{
this.ShowToastNotify(this,"不允许手机号开户");
return false;
}
}
return true;
}
/// <summary>
/// 电子会员卡开户
/// </summary>
private bool NewMemberElecCard()
{
bool isSuccess = true;
try
{
var request = new CardElecOpenRequest();
request.ShopNo = Global.Instance.Authc.StoreNo;
request.WorkerNo = Global.Instance.Worker.No;
request.PosNo = Global.Instance.Authc.PosNo;
request.Name = txtMemberName.Text.Trim() == "" ? "默认开户人" : txtMemberName.Text.Trim();
request.Passwd = txtCardPasswd.Text.Trim();
request.Mobile = txtMobile.Text.Trim();
request.Birthday = txtBirthday.Value.ToString("yyyy-MM-dd");
request.Description = txtDescription.Text;
request.Sex = checkBoxX1.Checked ? "1" : "0";
//来源-门店
request.SourceNo = "01";
//会员类型-个人
request.MemberTypeNo = "01";
var creType = cmbCreType.SelectedItem as CreTypeListResponse;
request.CreTypeNo = creType == null ? "" : creType.No;
request.CreNo = this.txtCreNo.Text.Trim();
var result = CardUtils.CardElecOpen(request);
if (result.Item1)
{
isSuccess = true;
CardElecOpenResponse cardElecOpenResponse = result.Item3;
cardOpenNo = cardElecOpenResponse.CardNo;
ShowMessage(this.lblInfo, result.Item2, false);
}
else
{
isSuccess = false;
ShowMessage(this.lblInfo, result.Item2, true);
}
}
catch (Exception ex)
{
isSuccess = false;
LOGGER.Error(ex, "电子会员卡开户异常");
}
return isSuccess;
}
/// <summary>
/// 会员卡开户
/// </summary>
private bool NewMemberCard(string cardNo)
{
bool isSuccess = true;
try
{
var request = new CardOpenRequest();
request.ShopNo = Global.Instance.Authc.StoreNo;
request.WorkerNo = Global.Instance.Worker.No;
request.PosNo = Global.Instance.Authc.PosNo;
request.CardNo = cardNo;
request.Name = txtMemberName.Text.Trim() == "" ? "默认开户人" : txtMemberName.Text.Trim();
request.Passwd = txtCardPasswd.Text.Trim();
request.Mobile = txtMobile.Text.Trim();
request.Birthday = txtBirthday.Text.Trim();
request.Description = txtDescription.Text;
request.Sex = checkBoxX1.Checked ? "1" : "0";
//来源-门店
request.SourceNo = "01";
//会员类型-个人
request.MemberTypeNo = "01";
var creType = cmbCreType.SelectedItem as CreTypeListResponse;
request.CreTypeNo = creType == null ? "" : creType.No;
request.CreNo = this.txtCreNo.Text.Trim();
var response = CardUtils.CardOpen(request);
//成功
if (response.Item1)
{
isSuccess = true;
CardOpenResponse cardOpenResponse = response.Item3;
cardOpenNo = cardOpenResponse.CardNo;
ShowMessage(this.lblInfo, response.Item2, false);
}
else
{
isSuccess = false;
ShowMessage(this.lblInfo, response.Item2, true);
}
}
catch (Exception ex)
{
isSuccess = false;
ShowMessage(this.lblInfo, LangProxy.ToLang("会员卡开户异常"), true);
LOGGER.Error(ex, "会员卡开户异常");
}
return isSuccess;
}
private void OnCloseTouchClick(object sender, EventArgs e)
{
//先关闭父窗体
if (this.Owner != null)
{
this.Owner.Close();
}
//再关闭当前窗体
this.Close();
}
protected void OnEscapeClick(object sender, EventArgs e)
{
OnCloseTouchClick(sender, e);
}
private void OnControlBoxCloseClick(object sender, EventArgs e)
{
OnCloseTouchClick(sender, e);
}
private void OnSelectTypeCheckedChanged(object sender, EventArgs e)
{
CheckBoxX item = (CheckBoxX)sender;
Enum.TryParse(item.Tag.ToString(), out this._currentReadCardType);
//默认不允许键盘输入卡号
bool allowInputCardNo = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_INPUT_CARDNO, true);
switch (this._currentReadCardType)
{
case MemberCardReadType.:
case MemberCardReadType.:
{
this.ShowMessage(this.lblInfo, LangProxy.ToLang("请输入11位手机号码"));
this.txtCardNo.ReadOnly = false;
this.lblCardNo.Text = LangProxy.ToLang("手机号码:");
this.txtCardNo.WatermarkText = LangProxy.ToLang("请输入手机号码");
this.txtCardNo.MaxLength = 11;
this.txtCardNo.Multiline = false;
this.txtMobile.Enabled = false;
this.ButtonReadCard.Enabled = false;
this.ButtonWeixinOpen.Enabled = false;
}
break;
case MemberCardReadType.IC:
{
this.ShowMessage(this.lblInfo, LangProxy.ToLang("请刷卡或挥卡"));
this.txtCardNo.ReadOnly = false;
this.lblCardNo.Text = LangProxy.ToLang("会员卡号:");
this.txtCardNo.MaxLength = 20;
this.txtCardNo.Multiline = false;
this.txtCardNo.WatermarkText = LangProxy.ToLang("请刷卡或者输入卡号");
this.txtMobile.Enabled = true;
this.ButtonReadCard.Enabled = true;
this.ButtonWeixinOpen.Enabled = false;
}
break;
}
this.txtCardNo.Multiline = false;
this.txtCardNo.Focus();
this.txtCardNo.SelectAll();
}
private void OnWindowMoveClick(object sender, MouseEventArgs e)
{
WindowsAPI.MoveWindows(this.Handle);
this.txtCardNo.Multiline = false;
this.txtCardNo.Focus();
this.txtCardNo.SelectAll();
}
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 OnCardNoValueChanged(object sender, EnterEventArg e)
{
switch (this._currentReadCardType)
{
case MemberCardReadType.:
case MemberCardReadType.:
{
this.txtMobile.Text = this.txtCardNo.Text;
}
break;
case MemberCardReadType.IC:
{
}
break;
}
}
/// <summary>
/// 读卡
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnReadCardTouchClick(object sender, TouchEventArgs e)
{
try
{
var result = CardOperateUtils.Instance.ReadCardNo();
if (result.Item1)
{
this.txtCardNo.Text = result.Item2;
}
else
{
result = CardOperateUtilsOther.Instance.ReadCardNo();
if (result.Item1)
{
this.txtCardNo.Text = result.Item2;
//读卡成功,模拟回车事件
InputSimulatorUtils.SendKey(KeyCodes.Map["return"]);
}
else
{
this.ShowMessage(lblInfo, result.Item2);
}
}
}
catch (Exception ex)
{
LOGGER.Error(ex, "读卡异常");
}
}
private void OnCardNoEnterClick(object sender, EnterEventArg e)
{
if (string.IsNullOrEmpty(this.txtCardNo.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请输入卡号或手机号"), true);
this.txtCardNo.SelectAll();
this.txtCardNo.Focus();
return;
}
this.txtCardPasswd.SelectAll();
this.txtCardPasswd.Focus();
}
private void OnOrgPayPwdEnterClick(object sender, EnterEventArg e)
{
if (string.IsNullOrEmpty(this.txtCardPasswd.Text.Trim()))
{
ShowMessage(this.lblInfo, LangProxy.ToLang("请设置密码"), true);
this.txtCardPasswd.SelectAll();
this.txtCardPasswd.Focus();
return;
}
this.txtMemberName.SelectAll();
this.txtMemberName.Focus();
}
public event NofityEventHandler OnRechargeClick;
}
}