XiangTan_DM/DM_Weight/ViewModels/HomeWindowViewModel.cs

649 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.Port;
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;
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;
/// <summary>
/// 冰箱温度
/// </summary>
private string _wd = "恒温冷藏抽屉当前温度2.8(非真实数据)";
public string WD { get => _wd; set => SetProperty(ref _wd, value); }
System.Timers.Timer WDTimer;
/// <summary>
/// 是否有冰箱抽屉
/// </summary>
private string hasFridge = ConfigurationManager.AppSettings["hasFridge"].ToString().Equals("1") ? "Visible" : "Collapsed";
public string HasFridge { get => hasFridge; set => SetProperty(ref hasFridge, value); }
private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1");
public bool MultiLogin
{
get => loginMode == 2;
}
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 PremissionDm? _selectedMenu;
private PremissionDm? _selectedChildMenu;
private List<PremissionDm>? _premissionDmList;
public PremissionDm? SelectedChildMenu
{
get { return _selectedChildMenu; }
set
{
//if (!_portUtil.Operate)
//{
// if (value != null)
// {
// if (value.PremissionPath.Equals("TakeRecordWindow"))
// {
// //定义传参变量
// NavigationParameters keys = new NavigationParameters();
// //添加参数,键值对格式
// keys.Add("Type", 2);
// _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
// }
// else if (value.PremissionPath.Equals("AddRecordWindow"))
// {
// //定义传参变量
// NavigationParameters keys = new NavigationParameters();
// //添加参数,键值对格式
// keys.Add("Type", 1);
// _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
// }
// else if (value.PremissionPath.Equals("ReturnRecordWindow"))
// {
// //定义传参变量
// NavigationParameters keys = new NavigationParameters();
// //添加参数,键值对格式
// keys.Add("Type", 3);
// _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
// }
// else if (value.PremissionPath.Equals("RetrunEmptyRecordWindow"))
// {
// //定义传参变量
// NavigationParameters keys = new NavigationParameters();
// //添加参数,键值对格式
// keys.Add("Type", 3);
// _regionManager.RequestNavigate("ContentRegion", value.PremissionPath, keys);
// }
// else if (value.PremissionPath.Equals("CheckRecordWindow"))
// {
// //定义传参变量
// NavigationParameters keys = new NavigationParameters();
// //添加参数,键值对格式
// keys.Add("Type", 4);
// _regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
// }
// else
// {
// if (value.PremissionPath.Equals("ReturnDrugWindow") || value.PremissionPath.Equals("ReturnDrugWindow2"))
// {
// if (ConfigurationManager.AppSettings["returnDrugMode"].ToString().Equals("1"))
// {
// _regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow2");
// }
// else
// {
// _regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow");
// }
// }
// else if (value.PremissionPath.Equals("SettingMainWindow") || value.PremissionPath.Equals("SettingWindow"))
// {
// if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"])>0)
// {
// _regionManager.RequestNavigate("ContentRegion", "SettingMainWindow");
// }
// else
// {
// _regionManager.RequestNavigate("ContentRegion", "SettingWindow");
// }
// }
// else
// {
// _regionManager.RequestNavigate("ContentRegion", value.PremissionPath);
// }
// }
// }
SetProperty(ref _selectedChildMenu, value);
//}
}
}
public PremissionDm? SelectedMenu
{
get { return _selectedMenu; }
set
{
//if (value != null)
//{
// if (value.PremissionName == "退出")
// {
// logger.Info($"用户【{Operator?.Nickname}】退出登录");
// Operator = null;
// Reviewer = null;
// _regionManager.RequestNavigate("MainRegion", "LoginWindow");
// }
// else
// {
// SelectedChildMenu = value.Children[0];
// }
//}
if (!_portUtil.Operate)
SetProperty(ref _selectedMenu, value);
else
{
logger.Info($"未关闭抽屉切换菜单");
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("请关闭抽屉后再切换菜单");
return;
}
}
}
//private DelegateCommand<ListBox> _selectionCommon;
//public DelegateCommand<ListBox> SelectionCommon
//{
// get => _selectionCommon ?? (_selectionCommon = new DelegateCommand<ListBox>(SelectionMethod));
//}
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("ContentRegion", "EmptyWindow");
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
//}));
//_regionManager.RequestNavigate("MainRegion", "BeforeLogin");
}
else
{
//SelectedMenu.Children = SelectedMenu.Children;
//SelectedChildMenu = SelectedMenu.Children[0];
if (!_portUtil.Operate)
{
_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
}
}
logger.Info("结束父菜单");
}
#region
private DelegateCommand _selectionChildCommon;
public DelegateCommand SelectionChildCommon
{
get => _selectionChildCommon ?? (_selectionChildCommon = new DelegateCommand(SelectionChildMethod));
}
private void SelectionChildMethod()
{
SelectChildNavigate(SelectedChildMenu);
}
private void SelectChildNavigate(PremissionDm SelectedChildMenu)
{
if (!_portUtil.Operate)
{
if (SelectedChildMenu != null)
{
if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 2);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("AddRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 1);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("ReturnRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 3);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("RetrunEmptyRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 3);
_regionManager.RequestNavigate("ContentRegion", SelectedChildMenu.PremissionPath, keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("CheckRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 4);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else
{
if (SelectedChildMenu.PremissionPath.Equals("ReturnDrugWindow") || SelectedChildMenu.PremissionPath.Equals("ReturnDrugWindow2"))
{
if (ConfigurationManager.AppSettings["returnDrugMode"].ToString().Equals("1"))
{
_regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow2");
}
else
{
_regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow");
}
}
else if (SelectedChildMenu.PremissionPath.Equals("SettingMainWindow") || SelectedChildMenu.PremissionPath.Equals("SettingWindow"))
{
//if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"])>0)
//{
// _regionManager.RequestNavigate("ContentRegion", "SettingMainWindow");
//}
//else
{
_regionManager.RequestNavigate("ContentRegion", "SettingWindow");
}
}
else
{
_regionManager.RequestNavigate("ContentRegion", SelectedChildMenu.PremissionPath);
}
}
}
}
}
#endregion
public List<PremissionDm> 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 PortUtil _portUtil;
//private CHKFunction _chkFunction;
IEventAggregator _eventAggregator;
public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IDialogService dialogService, IUnityContainer container, IEventAggregator eventAggregator)
{
_portUtil = portUtil;
_regionManager = iRegionManager;
_dialogService = dialogService;
_container = container;
this._eventAggregator = eventAggregator;
//_chkFunction = cHKFunction;
}
public DelegateCommand<string> OpenFingerDialog
{
get => new DelegateCommand<string>((string Type) =>
{
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("User", Type.Equals("Operator") ? Operator : Reviewer);
DialogServiceExtensions.ShowDialogHost(_dialogService, "FingerprintDialog", dialogParameters, DoDialogResult, "RootDialog");
});
}
public DelegateCommand OpenRecoverCommand
{
get => new DelegateCommand(async () =>
{
try
{
_portUtil.WindowName = "HomeWindow";
_portUtil.Operate = true;
await _portUtil.OpenStorage();
_portUtil.ResetData();
}
catch (Exception ex)
{
logger.Info($"OpenRecoverCommand异常{ex.Message}");
}
});
}
public DelegateCommand<string> OpenEditPasswordDialog
{
get => new DelegateCommand<string>((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 void FindDrawerCount()
{
int count = 0;
if (ConfigurationManager.AppSettings["MultiBatch"].ToString().Equals("1"))
{
count = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cs => cs.DrawerType != 3)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
else
{
count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType != 3)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
Is16Drawer = count == 16;
}
/// <summary>
/// 获取温度信息
/// </summary>
//private async void GetWD(object sender, ElapsedEventArgs e)
//{
// if (!_portUtil.FridgeOperate)
// {
// string retStr = string.Empty;
// byte[] data = null;
// float retT = await _portUtil.GetFridgeTemperature(1);
// Thread.Sleep(80);
// WD = $"恒温冷藏抽屉当前温度:{Math.Round((retT - 1.5), 2)}℃";
// }
//}
//private async void GetWD()
//{
// if (!_portUtil.FridgeOperate)
// {
// string retStr = string.Empty;
// byte[] data = null;
// float retT = await _portUtil.GetFridgeTemperature(1);
// Thread.Sleep(80);
// WD = $"恒温冷藏抽屉当前温度:{Math.Round((retT - 1.5), 2)}℃;";
// if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"]) > 1)
// {
// float retTemp = await _portUtil.GetFridgeTemperature(2);
// Thread.Sleep(80);
// WD += $"{retTemp}℃";
// }
// }
//}
/// <summary>
/// 将收到的返回转换成具体温度数值
/// </summary>
/// <param name="receiveData"></param>
/// <returns></returns>
public string GetResultWD(string receiveData)
{
try
{
//string newStrWD = receiveData.Substring(10, 4);
//logger.Info($"截取后数据newStrWD{newStrWD}");
int iWD = Convert.ToInt32(receiveData, 16);
logger.Info($"截取后数据iWD{iWD}");
float fWD = 0;
if (iWD != 0)
{
fWD = iWD * 1.0f / 10;
}
logger.Info($"截取后数据fWD{fWD}");
string strRet = $"恒温冷藏抽屉当前温度:{fWD}℃;";
return strRet;
}
catch (Exception ex)
{
logger.Info("GetResultWD异常", new Exception($"{ex.ToString()}"));
}
return "数据异常";
}
/// <summary>
/// 查看冰箱温度
/// </summary>
//public DelegateCommand CheckWDCommand { get => new DelegateCommand(CheckAction); }
//private void CheckAction()
//{
//GetWD();
//}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
_portUtil.dateTime = DateTime.Now;
//取出user
UserList = navigationContext.Parameters.GetValue<UserList>("operator");
Operator = UserList;
logger.Info($"发药人【{Operator.Nickname}】登录");
if (navigationContext.Parameters.ContainsKey("reviewer"))
{
UserList2 = navigationContext.Parameters.GetValue<UserList>("reviewer");
Reviewer = UserList2;
logger.Info($"审核人【{Reviewer.Nickname}】登录");
}
List<PremissionDm> premissions = UserList.Role.Permissions;
if (premissions.Count <= 0)
{
Operator = null;
Reviewer = null;
Application.Current.Dispatcher.Invoke(() =>
{
_regionManager.RequestNavigate("ContentRegion", "EmptyWindow");
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
});
AlertMsg alertMsg = new AlertMsg
{
Message = $"用户{UserList.Nickname}或还未设置权限,请联系管理员",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return;
}
//SqlSugarHelper.Db.SqlQueryable<PremissionDm>(sql)
//.ToTree(pd => pd.Children, pd => pd.ParentId, 0);
PremissionDmList = premissions;
SelectedMenu = premissions[0];
SelectedChildMenu = premissions[0].Children[0];
_regionManager.RequestNavigate("ContentRegion", premissions[0].Children[0].PremissionPath);
FindDrawerCount();
int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0");
if (autoExit > 0)
{
//int interval = autoExit * 1000;
new PromiseUtil<int>().taskAsyncLoop(1000, 0, async (options, next, stop) =>
{
try
{
if (!_portUtil.Operate &&_portUtil.OperateFinish)
{
// 无人操作鼠标键盘
if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > autoExit && CheckComputerFreeState.GetLastInputTime() > autoExit)
{
logger.Info($"设备{autoExit}内无人操作,用户【{Operator?.Nickname}】自动退出登录,_portUtil.Operate:{_portUtil.Operate},totalSecond:{(DateTime.Now - _portUtil.dateTime).TotalSeconds},lastInputTime:{CheckComputerFreeState.GetLastInputTime()},autoExit:{autoExit}");
Operator = null;
Reviewer = null;
//Application.Current.Dispatcher.Invoke(() =>
//{
stop();
System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
{
if (DialogHost.IsDialogOpen("RootDialog"))
{
DialogHost.Close("RootDialog");
}
_regionManager.RequestNavigate("ContentRegion", "EmptyWindow");
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
}));
//});
//timer.Dispose();
}
else
{
if (Operator == null)
{
stop();
}
else
{
next();
}
}
}
else
{
_portUtil.dateTime = DateTime.Now;
next();
}
}
catch (Exception ex)
{
logger.Info($"自动退出异常:{ex.Message}");
}
});
}
//#region 温度查询定时
//int interval = Convert.ToInt32(ConfigurationManager.AppSettings["Interval"]);
//if (interval > 0)
//{
// WDTimer = new System.Timers.Timer();
// WDTimer.Elapsed += new System.Timers.ElapsedEventHandler(GetWD);
// WDTimer.Interval = interval;
// //WDTimer.Start();
// //WDTimer.AutoReset = true;
// //WDTimer.Enabled = true;
//}
//#endregion
//GetWD();
//if (stopRecord > 0)
//{
// System.Timers.Timer timer = new System.Timers.Timer();
// timer.Interval = 1000;
// timer.Elapsed += (sender, e) =>
// {
// //指定时间内无人操作鼠标键盘则停止录像
// if (!_portUtil.Operate && CheckComputerFreeState.GetLastInputTime() > stopRecord)
// {
// _chkFunction.HIKStopDVRRecord();
// }
// };
// timer.Start();
//}
//logger.Info($"当前时间:{DateTime.Now}\r\n获取录像机的时间");
//获取录像机的时间
//_chkFunction.HIK_DVR_TIME();
//_chkFunction.HIKStartDVRRecord();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
}