|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|