using log4net; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; using SqlSugar; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using DM_Weight.Models; using DM_Weight.util; using DM_Weight.Views; using System.Timers; using Unity; using System.Windows.Threading; using Newtonsoft.Json.Linq; using DM_Weight.msg; using DM_Weight.HIKVISION; using System.Threading; using MaterialDesignThemes.Wpf; using System.Windows.Media; using System.Collections.ObjectModel; namespace DM_Weight.ViewModels { public class HomeWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime { private readonly ILog logger = LogManager.GetLogger(typeof(HomeWindowViewModel)); private readonly IDialogService _dialogService; private UserList? _userList; private UserList? _userList2; private SolidColorBrush _colorBrush; public SolidColorBrush SnackbarBackground { get => _colorBrush; set => SetProperty(ref _colorBrush, value); } private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3)); public ISnackbarMessageQueue SnackbarMessageQueue { get => _snackbarMessageQueue; set => SetProperty(ref _snackbarMessageQueue, value); } private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1"); public bool MultiLogin { get => loginMode == 2; } private PremissionDm? _selectedMenu; private PremissionDm? _selectedChildMenu; private List? _premissionDmList; public PremissionDm? SelectedChildMenu { get { return _selectedChildMenu; } set { SetProperty(ref _selectedChildMenu, value); } } public PremissionDm? SelectedMenu { get { return _selectedMenu; } set { SetProperty(ref _selectedMenu, value); } } private DelegateCommand _selectionCommon; public DelegateCommand SelectionCommon { get => _selectionCommon ?? (_selectionCommon = new DelegateCommand(SelectionMethod)); } private void SelectionMethod() { logger.Info("开始进入父菜单"); if (SelectedMenu != null && SelectedMenu.PremissionName == "退出") { logger.Info($"用户【{Operator?.Nickname}】退出登录"); Operator = null; Reviewer = null; System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => { _regionManager.RequestNavigate("MainRegion", "LoginWindow"); })); //_regionManager.RequestNavigate("MainRegion", "BeforeLogin"); } else { //SelectedMenu.Children = SelectedMenu.Children; //SelectedChildMenu = SelectedMenu.Children[0]; //_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath); } logger.Info("结束父菜单"); } #region #endregion public List PremissionDmList { get { return _premissionDmList; } set { SetProperty(ref _premissionDmList, value); } } public UserList UserList { get { return _userList; } set { SetProperty(ref _userList, value); } } public UserList UserList2 { get { return _userList2; } set { SetProperty(ref _userList2, value); } } public static UserList? Operator; public static UserList? Reviewer; IRegionManager _regionManager; IUnityContainer _container; private bool _is16Drawer; public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); } public bool KeepAlive => false; //private CHKFunction _chkFunction; IEventAggregator _eventAggregator; public HomeWindowViewModel(IRegionManager iRegionManager, IDialogService dialogService, IUnityContainer container, IEventAggregator eventAggregator) { _regionManager = iRegionManager; _dialogService = dialogService; _container = container; this._eventAggregator = eventAggregator; //_chkFunction = cHKFunction; } public DelegateCommand OpenFingerDialog { get => new DelegateCommand((string Type) => { DialogParameters dialogParameters = new DialogParameters(); dialogParameters.Add("User", Type.Equals("Operator") ? Operator : Reviewer); DialogServiceExtensions.ShowDialogHost(_dialogService, "FingerprintDialog", dialogParameters, DoDialogResult, "RootDialog"); }); } //public DelegateCommand OpenEditPasswordDialog //{ // get => new DelegateCommand((string Type) => // { // DialogParameters dialogParameters = new DialogParameters(); // dialogParameters.Add("EditPass", true); // dialogParameters.Add("User", Type.Equals("Operator") ? Operator : Reviewer); // DialogServiceExtensions.ShowDialogHost(_dialogService, "EditUserDialog", dialogParameters, DoDialogResult, "RootDialog"); // }); //} private void DoDialogResult(IDialogResult dialogResult) { // 委托 被动执行 被子窗口执行 // dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态 if (dialogResult.Result == ButtonResult.OK) { } } /// /// 查看冰箱温度 /// //public DelegateCommand CheckWDCommand { get => new DelegateCommand(CheckAction); } //private void CheckAction() //{ //GetWD(); //} #region 子菜单点击 private DelegateCommand _selectionChildCommon; public DelegateCommand SelectionChildCommon { get => _selectionChildCommon ?? (_selectionChildCommon = new DelegateCommand(SelectionChildMethod)); } private void SelectionChildMethod() { SelectChildNavigate(SelectedChildMenu); } private void SelectChildNavigate(PremissionDm SelectedChildMenu) { if (SelectedChildMenu != null) { _regionManager.RequestNavigate("ContentRegion", SelectedChildMenu.PremissionPath); } } #endregion //这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作 public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } //接收导航传过来的参数 public void OnNavigatedTo(NavigationContext navigationContext) { //取出user UserList = navigationContext.Parameters.GetValue("operator"); Operator = UserList; logger.Info($"发药人【{Operator.Nickname}】登录"); if (navigationContext.Parameters.ContainsKey("reviewer")) { UserList2 = navigationContext.Parameters.GetValue("reviewer"); Reviewer = UserList2; logger.Info($"审核人【{Reviewer.Nickname}】登录"); } PremissionDm child = new PremissionDm { Id = 46, PremissionName = "账册", PremissionPath = "AccountWindow" }; PremissionDm child2 = new PremissionDm { Id = 47, PremissionName = "药品专用账本", PremissionPath = "AccountWindowForDrug" }; ObservableCollection childrenList = new ObservableCollection(); childrenList.Add(child); childrenList.Add(child2); List premissions = new List() { new PremissionDm{Id=1,PremissionName="使用账册",PremissionPath="",PremissionImage="/Images/TbKuc.png",Children=childrenList}, new PremissionDm{Id=1,PremissionName="退出",PremissionPath="",PremissionImage="/Images/TbExit.png",Children=childrenList} }; if (premissions.Count <= 0) { Operator = null; Reviewer = null; Application.Current.Dispatcher.Invoke(() => { _regionManager.RequestNavigate("MainRegion", "LoginWindow"); }); AlertMsg alertMsg = new AlertMsg { Message = $"用户{UserList.Nickname}或还未设置权限,请联系管理员", Type = MsgType.ERROR }; _eventAggregator.GetEvent().Publish(alertMsg); return; } //SqlSugarHelper.Db.SqlQueryable(sql) //.ToTree(pd => pd.Children, pd => pd.ParentId, 0); PremissionDmList = premissions; SelectedMenu = premissions[0]; SelectedChildMenu = premissions[0].Children[0]; _regionManager.RequestNavigate("ContentRegion", "AccountWindow"); int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0"); int stopRecord = Convert.ToInt32(ConfigurationManager.AppSettings["stopRecord"] ?? "0"); if (autoExit > 0) { System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 1000; timer.Elapsed += (sender, e) => { // 30秒内无人操作鼠标键盘 if (CheckComputerFreeState.GetLastInputTime() > autoExit) { logger.Info($"设备30秒内无人操作,用户【{Operator?.Nickname}】自动退出登录"); //_chkFunction.HIKStopDVRRecord(); Operator = null; Reviewer = null; Application.Current.Dispatcher.Invoke(() => { _regionManager.RequestNavigate("MainRegion", "LoginWindow"); timer.Stop(); }); } }; timer.Start(); } } //每次导航的时候,该实列用不用重新创建,true是不重新创建,false是重新创建 public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } //这个方法用于拦截请求 public void OnNavigatedFrom(NavigationContext navigationContext) { } } }