using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using POSV.Card; using POSV.Bean; using POSV.Bill; using POSV.Utils; using DevComponents.DotNetBar.Controls; using DevComponents.DotNetBar.Metro; using DevComponents.DotNetBar; using POSV.Component; using System.Threading.Tasks; using System.Threading; using POS.Language.Language; namespace POSV.Business { public partial class MemberPanelEx : AbstractFlyoutPanelEx { /// /// 当前会员选择的会员卡 /// private MemberCard _currentCard = null; /// /// 会员卡参数配置规则 /// private MemberCardItem _currentCardItem = null; /// /// 当前读卡的方式 /// private MemberCardReadType _currentReadCardType = MemberCardReadType.手机号码; /// /// 会员卡操作 /// private MemberCardOperator _currentOperator = MemberCardOperator.会员刷卡; /// /// 当前会员对象,操作员输入条件后获取的对象 /// private MemberInfoQueryResponse _currentMemberInfo = null; /// /// 是否是M1读卡 /// private bool isM1Card = false; private bool _lock = false; public MemberPanelEx(MemberInfoQueryResponse member) { InitializeComponent(); this._currentMemberInfo = member; if (member != null) { this._currentCard = member.CurrentCard; } this.tabCardControl.TabsVisible = false; } public override void CloseFlyout() { base.CloseFlyout(); _lock = false; //中止读卡 CardOperateUtils.Instance.TerminationCardRead(); //中止读卡 CardOperateUtilsOther.Instance.TerminationCardRead(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); SetStyle(ControlStyles.Selectable, true); //会员卡号 this.txtCardNo.Multiline = false; this.txtCardNo.Focus(); this.txtCardNo.Select(); //主界面没有刷卡 if (this._currentMemberInfo == null) { this._currentOperator = MemberCardOperator.会员刷卡; this.tabCardRead.Visible = true; this.tabCardSelected.Visible = false; this.tabCardInfo.Visible = false; this.tabCardControl.SelectedTab = this.tabCardRead; } else { this._currentOperator = MemberCardOperator.会员信息; this.tabCardRead.Visible = false; this.tabCardSelected.Visible = false; this.tabCardInfo.Visible = true; this.tabCardControl.SelectedTab = this.tabCardInfo; } _lock = true; this.RefreshUi(); } /// /// 调整会员卡操作Tab项 /// private void RefreshUi() { switch (this._currentOperator) { case MemberCardOperator.会员刷卡: { //会员规则 this._currentCardItem = JsonUtils.Deserialize(Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_MEMBER_CARD)); if (this._currentCardItem.ListReader.Contains(MemberCardReadType.磁条卡或IC卡) && this._currentCardItem.ListType.Contains(MemberCardType.Mifare)) { //启用M1卡,自动打开循环读卡模式 Task.Factory.StartNew(() => { while (_lock) { Thread.Sleep(1000); var result = CardOperateUtils.Instance.ReadCardNoContinue(); if (result.Item1) { if (result.Item2.Length == 16) { if (!this.IsHandleCreated || this.IsDisposed) return; this.Invoke(new Action(() => { this.txtCardNo.Text = result.Item2; isM1Card = true; //读卡成功,模拟回车事件 InputSimulatorUtils.SendKey(KeyCodes.Map["return"]); })); break; } else { this.ShowMessage(lblInfo, LangProxy.ToLang("卡号非法"), true); } } else { result = CardOperateUtilsOther.Instance.ReadCardNoContinue(); if (result.Item1) { if (!this.IsHandleCreated || this.IsDisposed) return; this.Invoke(new Action(() => { this.txtCardNo.Text = result.Item2; isM1Card = true; //读卡成功,模拟回车事件 InputSimulatorUtils.SendKey(KeyCodes.Map["return"]); })); break; } else { this.ShowMessage(lblInfo, result.Item2, false); } } } }); } this.txtCardNo.Multiline = false; //更换会员 不显示 this.ButtonChangeMember.Visible = false; } break; case MemberCardOperator.会员信息: { //关闭读卡器 CardOperateUtils.Instance.TerminationCardRead(); //关闭读卡器 CardOperateUtilsOther.Instance.TerminationCardRead(); _lock = false; //更换会员 显示 this.ButtonChangeMember.Visible = true; this.lblName.Text = this._currentMemberInfo.Name; this.lblMobile.Text = this._currentMemberInfo.Mobile; this.lblBirthday.Text = this._currentMemberInfo.Birthday; this.lblSex.Text = LangProxy.ToLang(this._currentMemberInfo.Sex == 0 ? "女" : "男"); this.lblSourceName.Text = this._currentMemberInfo.SourceName; this.lblmemberLevelName.Text = this._currentMemberInfo.MemberLevelName; var cardNo = string.IsNullOrEmpty(this._currentCard.FaceNo) ? this._currentCard.CardNo : this._currentCard.FaceNo; this.lblCardNo.Text = CardUtils.CardNoEncrypt(cardNo); //卡状态(1-正常;2-预售;3-挂失;4-冻结;5-销户;) var cardStatus = (MemberCardStatus)Enum.ToObject(typeof(MemberCardStatus), this._currentCard.Status); this.lblStatus.Text = cardStatus.ToString(); this.lblCardType.Text = this._currentCard.CardTypeName; //this.lblCardLevel.Text = this._currentCard.CardLevelName; this.lblBalance.Text = this._currentCard.AvailableAmount.ToString(); this.lblPoint.Text = this._currentCard.TotalPoint.ToString(); this.lblDiscount.Text = LangProxy.ToLang("默认原价"); } break; } } private bool VerifyInputValue() { if (string.IsNullOrEmpty(this.txtCardNo.Text.Trim())) { return false; } else { return true; } } /// /// 操作是否验证通过 /// private bool PaymentVerify = false; private void OnTouchBeforeClick(object sender, Component.TouchEventArgs e) { this.PaymentVerify = VerifyInputValue(); } private void OnTouchClick(object sender, Component.TouchEventArgs e) { switch (e.Value) { case "clear": //如果当前焦点控件是输入框 if (this.ActiveControl is TextBox) { var activeControl = this.ActiveControl as TextBox; activeControl.Text = string.Empty; RefreshUi(); } break; case "accept": //验证通过 if (this.PaymentVerify) { switch (this._currentOperator) { case MemberCardOperator.会员刷卡: { var voucherNo = this.txtCardNo.Text.Trim(); //智能识别刷卡方式 var way = CardUtils.JudgeCardWay(Global.Instance.Worker.TenantId, voucherNo); if (way == MemberCardNoType.未知) { this.ShowMessage(this.lblInfo, LangProxy.ToLang("无法识别的卡号,请确认"), true); return; } MemberInfoQueryRequest request = new MemberInfoQueryRequest(); request.Keyword = voucherNo; this._currentCardItem = JsonUtils.Deserialize(Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_MEMBER_CARD)); var _bool = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_ALLOW_MEMBER_MEMBERSHIPCARDARENOTALLOWED, false); if (_bool && way == MemberCardNoType.真实卡号) { this.ShowMessage(this.lblInfo, LangProxy.ToLang("不允许刷卡"), true); return; } switch (way) { case MemberCardNoType.电子卡号: { if (this._currentCardItem.ListReader.Contains(MemberCardReadType.电子卡)) { request.Property = "scanCode"; } else { this.ShowMessage(this.lblInfo, LangProxy.ToLang("不支持[电子卡号]方式识别会员"), true); return; } } break; case MemberCardNoType.真实卡号: { if (this._currentCardItem.ListReader.Contains(MemberCardReadType.磁条卡或IC卡)) { request.Property = "cardNo"; } else { this.ShowMessage(this.lblInfo, LangProxy.ToLang("不支持[卡号]方式识别会员"), true); return; } } break; case MemberCardNoType.手机号: { if (this._currentCardItem.ListReader.Contains(MemberCardReadType.手机号码)) { request.Property = "mobile"; } else { this.ShowMessage(this.lblInfo, LangProxy.ToLang("不支持[手机号]方式识别会员"), true); return; } } break; case MemberCardNoType.卡面号: { if (this._currentCardItem.ListReader.Contains(MemberCardReadType.磁条卡或IC卡)) { request.Property = "surfaceNo"; } else { this.ShowMessage(this.lblInfo, LangProxy.ToLang("不支持[卡号]方式识别会员"), true); return; } } break; } if (!isM1Card) { //是否允许手工输入卡号 var allowInput = Global.Instance.GlobalConfigStringValue(ConfigConstant.CASHIER_ALLOW_INPUT_CARDNO, "0"); if ("0".Equals(allowInput) && maxChangeTime > 200 && (request.Property.Equals("surfaceNo") || request.Property.Equals("cardNo"))) { txtCardNo.Text = ""; this.ShowMessage(this.lblInfo, LangProxy.ToLang("不允许手工录入卡号"), true); return; } } isM1Card = false; 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._currentMemberInfo = resp.Item3; this._currentMemberInfo.GetWay = way; if (this._currentMemberInfo.CardList.Count == 0) { this.ShowMessage(this.lblInfo, LangProxy.ToLang("没有可用的会员卡..."), true); return; } if (this._currentMemberInfo.CardList.Count > 1) { this._currentOperator = MemberCardOperator.多卡选择; this.tabCardRead.Visible = false; this.tabCardInfo.Visible = false; this.tabCardSelected.Visible = true; this.tabCardControl.SelectedTab = this.tabCardSelected; //更换会员 显示 this.ButtonChangeMember.Visible = true; this.ShowMessage(this.lblInfo, "获取到" + this._currentMemberInfo.CardList.Count + "张卡,请选择", false); //多张会员卡,等待收银员选择 this._currentCard = null; //进入多卡选择界面 this.BuilderSelectedCard(this._currentMemberInfo.CardList); } else { //只有一张会员卡,自动选择作为当前可用会员卡 this._currentCard = this._currentMemberInfo.CardList[0]; //将当前选择会员卡赋值 this._currentMemberInfo.CurrentCard = this._currentCard; //通知主界面改变 this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify, this._currentMemberInfo)); this._currentOperator = MemberCardOperator.会员信息; this.tabCardRead.Visible = false; this.tabCardSelected.Visible = false; this.tabCardInfo.Visible = true; this.tabCardControl.SelectedTab = this.tabCardInfo; //更换会员 显示 this.ButtonChangeMember.Visible = true; this.RefreshUi(); this.ShowMessage(this.lblInfo, LangProxy.ToLang("查看会员信息"), false); } } else { this.ShowMessage(this.lblInfo, resp.Item2, true); return; } } break; } } break; default: InputSimulatorUtils.SendKey(KeyCodes.Map[e.Value]); break; } } private void OnChangedMemberCardClick(object sender, EventArgs e) { this._currentOperator = MemberCardOperator.会员刷卡; this.tabCardRead.Visible = true; this.tabCardSelected.Visible = false; this.tabCardInfo.Visible = false; this.tabCardControl.SelectedTab = this.tabCardRead; //更换会员 不显示 this.ButtonChangeMember.Visible = false; this.txtCardNo.Focus(); this.txtCardNo.SelectAll(); //重置会员卡参数 this._currentCard = null; this._currentMemberInfo = null; //通知主界面改变 this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify, this._currentMemberInfo)); } /// /// 构建多张会员卡选择 /// private void BuilderSelectedCard(List lists) { this.itemPanel.Items.Clear(); this.itemPanel.Font = Constant.NORMAL_FONT; foreach (var card in lists) { MetroTileItem item = new MetroTileItem(); item.TileStyle.PaddingTop = 2; item.TileStyle.PaddingLeft = item.TileStyle.PaddingRight = item.TileStyle.PaddingBottom = -1; item.CheckBehavior = eMetroTileCheckBehavior.LeftMouseButtonClick; item.OptionGroup = "SelectedCard"; item.TileSize = new Size(180, 45); item.Checked = false; item.TileColor = eMetroTileColor.Teal; item.TileStyle.Font = Constant.NORMAL_FONT; item.TileStyle.TextAlignment = eStyleTextAlignment.Near; item.TileStyle.TextLineAlignment = eStyleTextAlignment.Near; item.TitleTextFont = Constant.NORMAL_FONT; item.TitleTextAlignment = ContentAlignment.BottomLeft; //卡状态(1-正常;2-预售;3-挂失;4-冻结;5-销户;) var cardStatus = (MemberCardStatus)Enum.ToObject(typeof(MemberCardStatus), card.Status); item.Text = string.Format("{0} {1} {2}", card.CardNo, cardStatus.ToString(), this._currentMemberInfo.Name); item.TitleText = string.Format(LangProxy.ToLang("余额:{0} 积分:{1}"), card.AvailableAmount, card.TotalPoint); item.Tag = card; item.MouseDown += (o, args) => { MetroTileItem _item = o as MetroTileItem; _item.Checked = true; }; item.CheckedChanged += (o, args) => { MetroTileItem _item = o as MetroTileItem; if (_item.Checked) { MemberCard _card = _item.Tag as MemberCard; //多张卡,操作员选择一张 this._currentCard = _card; //将当前选择会员卡赋值 this._currentMemberInfo.CurrentCard = this._currentCard; _item.TileColor = eMetroTileColor.Coffee; //通知主界面改变 this.OnNotifyChanged(new FlyoutEventArgs(FlyoutAction.Notify, this._currentMemberInfo)); //选择会员卡后转入会员消费 this._currentOperator = MemberCardOperator.会员信息; this.tabCardRead.Visible = false; this.tabCardSelected.Visible = false; this.tabCardInfo.Visible = true; this.tabCardControl.SelectedTab = this.tabCardInfo; //更换会员 显示 this.ButtonChangeMember.Visible = true; this.ShowMessage(this.lblInfo, LangProxy.ToLang("查看会员信息"), false); this.RefreshUi(); } else { _item.TileColor = eMetroTileColor.Teal; } }; this.itemPanel.Items.Add(item); } this.itemPanel.Invalidate(); } private void OnMemberCardEnterClick(object sender, Component.EnterEventArg e) { this.OnTouchBeforeClick(this.touchButtonX4, new TouchEventArgs("accept")); if (this.PaymentVerify) { this.OnTouchClick(this.touchButtonX4, new TouchEventArgs("accept")); } } private long maxChangeTime = 0; private bool input = false; private long upTime = 0; /// /// 监听输入框不允许输入 /// /// /// private void OnMemberValueChage(object sender, EnterEventArg e) { if (txtCardNo.Text.Length == 0) { maxChangeTime = 0; input = false; upTime = 0; } if (txtCardNo.Text.Length == 1) { upTime = DateTime.Now.ToUniversalTime().Ticks; } if (txtCardNo.Text.Length > 1) { input = true; } if (input) { var nowTime = DateTime.Now.ToUniversalTime().Ticks; if ((nowTime - upTime) / 10000 > maxChangeTime) { maxChangeTime = (nowTime - upTime) / 10000; } logger.Info("输入号码耗时======>" + maxChangeTime); } } private void touchButtonX13_Click(object sender, EventArgs e) { } } }