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.

601 lines
26 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// 当前会员选择的会员卡
/// </summary>
private MemberCard _currentCard = null;
/// <summary>
/// 会员卡参数配置规则
/// </summary>
private MemberCardItem _currentCardItem = null;
/// <summary>
/// 当前读卡的方式
/// </summary>
private MemberCardReadType _currentReadCardType = MemberCardReadType.;
/// <summary>
/// 会员卡操作
/// </summary>
private MemberCardOperator _currentOperator = MemberCardOperator.;
/// <summary>
/// 当前会员对象,操作员输入条件后获取的对象
/// </summary>
private MemberInfoQueryResponse _currentMemberInfo = null;
/// <summary>
/// 是否是M1读卡
/// </summary>
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();
}
/// <summary>
/// 调整会员卡操作Tab项
/// </summary>
private void RefreshUi()
{
switch (this._currentOperator)
{
case MemberCardOperator.:
{
//会员规则
this._currentCardItem = JsonUtils.Deserialize<MemberCardItem>(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;
}
}
/// <summary>
/// 操作是否验证通过
/// </summary>
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<MemberCardItem>(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));
}
/// <summary>
/// 构建多张会员卡选择
/// </summary>
private void BuilderSelectedCard(List<MemberCard> 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;
/// <summary>
/// 监听输入框不允许输入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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)
{
}
}
}