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.

345 lines
12 KiB
C#

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.Utils;
using POSV.HttpApi;
using POSV.Entity;
using POSV.ShoppingCart;
using POSV.Common.Util;
using POS.Language.Language;
namespace POSV.Component
{
[ToolboxItem(true)]
public partial class AuthPanelEx : AbstractFlyoutPanelEx
{
/// <summary>
/// 标识是否需要校验
/// </summary>
private const string PermissionCode = "__PC__";
/// <summary>
/// 期望的折扣率
/// </summary>
private const decimal DiscountRate = decimal.MaxValue;
/// <summary>
/// 期望的免单额
/// </summary>
private const decimal FreeAmount = decimal.MaxValue;
private Timer _timer = new Timer();
private List<SlotCardAuthorizationData> _slotCardAuthorizations = new List<SlotCardAuthorizationData>();
CreditCardAuthorization creditCardAuthorization1 = new CreditCardAuthorization();
public AuthPanelEx()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.SetStyle(ControlStyles.Selectable, true);
this.txtPasswd.Multiline = false;
this.txtPasswd.Text = string.Empty;
this.txtWorkerNo.Multiline = false;
this.txtWorkerNo.Text = string.Empty;
this.ActiveControl = this.txtWorkerNo;
CreditCardAuthorization();
}
public void SetTitle(string title)
{
this.lblTitle.Text = creditCardAuthorization1.lbltitle.Text = string.Format(this.lblTitle.Tag.ToString(), string.IsNullOrEmpty(title) ? "" : title);
creditCardAuthorization1.lbltitle.Visible = true;
}
public void SetFocus()
{
this.txtPasswd.Multiline = false;
this.txtPasswd.Text = string.Empty;
this.txtWorkerNo.Multiline = false;
this.txtWorkerNo.Text = string.Empty;
this.txtWorkerNo.Focus();
this.txtWorkerNo.SelectAll();
}
public void ShowMessage(string message, bool error)
{
this.Invoke(new Action(() =>
{
this.ShowMessage(this.lblInfo, message, error);
}));
}
private string _permissionCode = PermissionCode;
private decimal _expectDiscountRate = DiscountRate;
private decimal _expectFreeAmount = FreeAmount;
/// <summary>
/// 设置验证的权限项
/// </summary>
/// <param name="permissionCode"></param>
public void ExpectValidate(string permissionCode = PermissionCode, decimal expectDiscountRate = DiscountRate, decimal expectFreeAmount = FreeAmount)
{
this._permissionCode = permissionCode;
this._expectDiscountRate = expectDiscountRate;
this._expectFreeAmount = expectFreeAmount;
}
public event AuthEventHandler ButtonClick;
public virtual void OnButtonClick(AuthEventArgs e)
{
ButtonClick?.Invoke(this, e);
}
private bool ValidateInputValue()
{
if (string.IsNullOrEmpty(txtWorkerNo.Text.Trim()))
{
this.ShowMessage(this.lblInfo, "工号不能为空,请输入...", false);
this.txtWorkerNo.Focus();
return false;
}
if (string.IsNullOrEmpty(txtPasswd.Text.Trim()))
{
this.ShowMessage(this.lblInfo, "密码不能为空,请输入...", false);
this.txtPasswd.Focus();
return false;
}
this.ShowMessage(this.lblInfo, "提交认证中,请稍候...", false);
return true;
}
private void Login()
{
try
{
var userName = this.txtWorkerNo.Text.Trim().PadLeft(5, '0');
var passwd = this.txtPasswd.Text.Trim();
Tuple<bool, string, Worker> response = LoginApi.DatabaseLogin(userName, passwd);
if (response.Item1)
{
_timer.Interval = 5000;
Tuple<decimal, decimal, List<string>, Worker> permission = BusinessUtils.Instance.GetPermission(response.Item3);
//功能权限不校验或者校验并拥有
bool isPermission = PermissionCode.Equals(this._permissionCode) || permission.Item3.Contains(this._permissionCode);
if (!isPermission)
{
this.ShowMessage(this.lblInfo, string.Format(LangProxy.ToLang("授权人[{0}]没有该权限"), permission.Item4.No));
creditCardAuthorization1.lblInfo.Text = string.Format(LangProxy.ToLang("授权人[{0}]没有该权限"), permission.Item4.No);
creditCardAuthorization1.lblInfo.Visible = true;
}
//折扣数据权限
bool isDiscountRate = DiscountRate == this._expectDiscountRate || permission.Item1 <= this._expectDiscountRate;
if (!isDiscountRate)
{
this.ShowMessage(this.lblInfo, string.Format(LangProxy.ToLang("授权人[{0}]折扣权限不足"), permission.Item4.No));
creditCardAuthorization1.lblInfo.Text = string.Format(LangProxy.ToLang("授权人[{0}]折扣权限不足"), permission.Item4.No);
creditCardAuthorization1.lblInfo.Visible = true;
}
//免单数据权限
bool isFreeAmount = FreeAmount == this._expectFreeAmount || permission.Item2 >= this._expectFreeAmount;
if (!isFreeAmount)
{
this.ShowMessage(this.lblInfo, string.Format(LangProxy.ToLang("授权人[{0}]免单权限不足"), permission.Item4.No));
creditCardAuthorization1.lblInfo.Text = string.Format(LangProxy.ToLang("授权人[{0}]免单权限不足"), permission.Item4.No);
creditCardAuthorization1.lblInfo.Visible = true;
}
if (isPermission && isDiscountRate && isFreeAmount)
{
this._timer.Stop();
this.OnButtonClick(new AuthEventArgs(AuthAction.Accept, "accept", permission));
}
else
{
this.txtWorkerNo.SelectAll();
this.txtWorkerNo.Focus();
}
}
else
{
this.ShowMessage(this.lblInfo, response.Item2, true);
}
}
catch (Exception ex)
{
LOGGER.Error(ex, "收银员登录验证异常");
this.ShowMessage(this.lblInfo, LangProxy.ToLang("收银员登录验证异常"), true);
}
}
private void OnInputEnterClick(object sender, EnterEventArg e)
{
var valid = ValidateInputValue();
if (valid)
{
Login();
}
}
private void OnTouchClick(object sender, TouchEventArgs e)
{
switch (e.Value)
{
case "clear":
//如果当前焦点控件是输入框
if (this.ActiveControl is NumericTextBox)
{
var activeControl = this.ActiveControl as NumericTextBox;
activeControl.Text = string.Empty;
}
break;
case "accept":
//验证通过
{
var valid = ValidateInputValue();
if (valid)
{
Login();
}
}
break;
default:
{
InputSimulatorUtils.SendKey(KeyCodes.Map[e.Value]);
}
break;
}
}
private void OnButtonCloseClick(object sender, TouchEventArgs e)
{
this.OnButtonClick(new AuthEventArgs(AuthAction.Close, "close", ""));
}
private void OnButtonBackClick(object sender, TouchEventArgs e)
{
this.OnButtonClick(new AuthEventArgs(AuthAction.Cancel, "cancel", ""));
}
/// <summary>
/// 刷卡授权
/// </summary>
private void CreditCardAuthorization()
{
var _enabled = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SWIPING_CARD_ENABLED, "false");
if (!_enabled.ToLower().Equals("true"))
{
return;
}
this.Controls.Add(creditCardAuthorization1);
creditCardAuthorization1.Dock = DockStyle.Fill;
creditCardAuthorization1.BringToFront();
creditCardAuthorization1.Visible = true;
creditCardAuthorization1.visibleEventHandler += VisibleEventHandler;
_timer.Interval = 1000;
_timer.Tick += _timer_Tick;
_timer.Start();
_slotCardAuthorizations = JSON.Deserialize<List<SlotCardAuthorizationData>>(Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SWIPING_CARD_DATA, "[]"));
}
private void VisibleEventHandler(object sender)
{
this._timer.Stop();
this._timer.Enabled = false;
this.txtPasswd.Text = string.Empty;
this.txtWorkerNo.Text = string.Empty;
}
private void _timer_Tick(object sender, EventArgs e)
{
var result = Utils.CardOperateUtils.Instance.ReadCardNo();
if (result.Item1)
{
var _card = result.Item2;
var _data = this._slotCardAuthorizations.FirstOrDefault(f => f.CardNo == _card);
if (_data == null)
{
creditCardAuthorization1.lblInfo.Text = LangProxy.ToLang( "此卡无授权!");
creditCardAuthorization1.lblInfo.Visible = true;
this._timer.Interval = 5000;
return;
}
this.txtWorkerNo.Text = _data.Account;
this.txtPasswd.Text = _data.Password;
Login();
}
else
{
if (result.Item2.Contains("请将会员卡放置在读卡区"))
{
return;
}
result = Utils.CardOperateUtilsOther.Instance.ReadCardNo();
creditCardAuthorization1.lblInfo.Text = result.Item2;
creditCardAuthorization1.lblInfo.Visible = true;
this._timer.Interval = 5000;
}
}
}
public delegate void AuthEventHandler(object sender, AuthEventArgs e);
public enum AuthAction
{
None = 0,
Cancel = 1,
Accept = 2,
Notify = 3,
Close = 4
}
public class AuthEventArgs : EventArgs
{
public readonly AuthAction Action;
public readonly string KeyCode;
public readonly object Data;
public AuthEventArgs(AuthAction action, string keyCode, object data)
{
this.KeyCode = keyCode;
this.Data = data;
this.Action = action;
}
}
}