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 { /// /// 标识是否需要校验 /// private const string PermissionCode = "__PC__"; /// /// 期望的折扣率 /// private const decimal DiscountRate = decimal.MaxValue; /// /// 期望的免单额 /// private const decimal FreeAmount = decimal.MaxValue; private Timer _timer = new Timer(); private List _slotCardAuthorizations = new List(); 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; /// /// 设置验证的权限项 /// /// 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 response = LoginApi.DatabaseLogin(userName, passwd); if (response.Item1) { _timer.Interval = 5000; Tuple, 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", "")); } /// /// 刷卡授权 /// 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>(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; } } }