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.

224 lines
7.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NLog;
using POSV.Common.Util;
using POSV.Component;
using POSV.Entity;
using POSV.ShoppingCart;
using POSV.Utils;
namespace POSV
{
public partial class AuthDialogForm : BusinessForm
{
private Tuple<decimal , decimal , List<string> , Worker> _authz = null;
private readonly OrderObject _orderObject;
/// <summary>
/// 同步线程调用是通过该字段判断是否成功授权
/// </summary>
private readonly string _permissionCode;
public bool IsAccredit = false;
public AuthDialogForm(string title ,string permissionCode, OrderObject orderObject)
{
InitializeComponent();
this._orderObject = orderObject;
this._permissionCode = string.IsNullOrEmpty(permissionCode) ? "" : permissionCode;
this.authPanel.SetFocus();
this.authPanel.SetTitle(title);
this.authPanel.ExpectValidate();
//定义授权界面的操作事件
this.authPanel.ButtonClick += OnAuthzButtonClick;
}
public void ExpectValidate(string permissionCode , decimal expectDiscountRate = decimal.MaxValue , decimal expectFreeAmount = decimal.MaxValue)
{
this.authPanel.ExpectValidate(permissionCode, expectDiscountRate,expectFreeAmount);
}
/// <summary>
/// 授权事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnAuthzButtonClick(object sender , AuthEventArgs e)
{
switch (e.Action)
{
case AuthAction.Close:
case AuthAction.Cancel:
{
OnControlBoxCloseClick(sender , EventArgs.Empty);
}
break;
case AuthAction.Accept:
{
if (e.Data is Tuple<decimal , decimal , List<string> , Worker>)
{
this._authz = e.Data as Tuple<decimal , decimal , List<string> , Worker>;
//授权人拥有该功能
if(this._authz != null && this._authz.Item3.Contains(_permissionCode))
{
var logInfo = string.Format("操作由[{0},{1}]授权" , this._authz.Item4.No , this._authz.Item4.Name);
LogUtils.WriteLog(LogAction. , logInfo , this._authz.Item4.No , this._orderObject == null ? string.Empty : this._orderObject.TradeNo, this._orderObject == null ? 0 : this._orderObject.DiscountAmount);
this.OnAcceptButtonClick(new TransparentEventArgs(TransparentAction.Accept , e.KeyCode , e.Data));
this.IsAccredit = true;
OnControlBoxCloseClick(sender , EventArgs.Empty);
}
else
{
this.authPanel.ShowMessage(string.Format("授权人[{0}]没有该权限", this._authz.Item4.No) , true);
}
}
}
break;
}
}
private void OnControlBoxCloseClick(object sender , EventArgs e)
{
if (this.Owner != null)
{
this.Owner.Close();
}
this.Close();
}
}
public class AuthzUtils
{
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static object _lock = new object();
private static AuthzUtils _instance = null;
public static AuthzUtils Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
_instance = new AuthzUtils();
}
}
return _instance;
}
}
public Tuple<bool , string> CheckAuthz(Control overlay , string title , string permissionCode , Action action)
{
bool isGo = true;
string message = "权限校验成功";
//是否启用授权窗口
var isAuthz = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_AUTO_LOCK_DISABLE , false);
//没有按钮权限
if (isGo && !isAuthz)
{
message = "您目前没有操作该功能的权限!";
isGo = false;
}
if (isGo)
{
//有权限
if (Global.Instance.HasPermission(permissionCode))
{
action();
}
else
{
var authForm = new AuthDialogForm(title , permissionCode , null);
authForm.ExpectValidate(permissionCode);
authForm.AcceptButtonClick += (o , args) =>
{
if (args.Data is Tuple<decimal , decimal , List<string> , Worker>)
{
action();
}
};
authForm.CancelButtonClick += (o , args) => { };
TransparentForm trans = new TransparentForm(overlay , authForm);
trans.Show(overlay);
}
}
return new Tuple<bool , string>(isGo , message);
}
public Tuple<bool , string> CheckAuthz(Control overlay , ModuleKeyCode keyCode , string permissionCode , OrderObject orderObject , Action<Tuple<decimal , decimal , List<string> , Worker>> action)
{
bool isGo = true;
string message = "权限校验成功";
//是否启用授权窗口
var isAuthz = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CASHIER_AUTO_LOCK_DISABLE , false);
//没有按钮权限
if (isGo && !isAuthz)
{
message = "您目前没有操作该功能的权限!";
isGo = false;
}
if (isGo)
{
//有权限
if (Global.Instance.HasPermission(permissionCode))
{
action(null);
}
else
{
var authForm = new AuthDialogForm(keyCode.ToString() , permissionCode , orderObject);
authForm.ExpectValidate(permissionCode);
authForm.AcceptButtonClick += (o , args) =>
{
if (args.Data is Tuple<decimal , decimal , List<string> , Worker>)
{
var authz = args.Data as Tuple<decimal , decimal , List<string> , Worker>;
action(authz);
}
};
authForm.CancelButtonClick += (o , args) => { };
TransparentForm trans = new TransparentForm(overlay , authForm);
trans.Show(overlay);
}
}
return new Tuple<bool , string>(isGo , message);
}
}
}