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 { /// /// 会员卡开户响应信息 /// private String cardOpenNo; /// /// 会员卡参数配置规则 /// private MemberCardItem _currentCardItem = null; /// /// 当前读卡的方式 /// 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(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; } })); } }); } /// /// 输入是否验证通过 /// 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 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 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)); } /// /// 是否允许手机开户验证 /// /// 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; } /// /// 电子会员卡开户 /// 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; } /// /// 会员卡开户 /// 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; } } /// /// 读卡 /// /// /// 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; } }