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#

9 months ago
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)
{
}
}
}