HKC/DM_Weight/ViewModels/HomeWindowViewModel.cs

657 lines
27 KiB
C#
Raw Normal View History

2023-11-13 11:52:43 +08:00
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 System.Diagnostics;
2023-11-13 11:52:43 +08:00
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;
2024-07-08 11:44:31 +08:00
/// <summary>
/// 冰箱温度
/// </summary>
private string _wd = "恒温冷藏抽屉当前温度2.8(非真实数据)";
public string WD { get => _wd; set => SetProperty(ref _wd, value); }
System.Timers.Timer WDTimer;
System.Timers.Timer WSDTimer;
/// <summary>
/// 是否有冰箱抽屉
/// </summary>
2024-07-08 11:44:31 +08:00
private string hasFridge = ConfigurationManager.AppSettings["hasFridge"].ToString().Equals("1") ? "Visible" : "Collapsed";
public string HasFridge { get => hasFridge; set => SetProperty(ref hasFridge, value); }
2023-11-13 11:52:43 +08:00
private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1");
public bool MultiLogin
{
get => loginMode == 2;
}
private PremissionDm? _selectedMenu;
private PremissionDm? _selectedChildMenu;
private List<PremissionDm>? _premissionDmList;
public PremissionDm? SelectedChildMenu
{
get { return _selectedChildMenu; }
set
{
2024-11-05 08:49:56 +08:00
//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);
//}
}
}
private void SelectChildNavigate(PremissionDm SelectedChildMenu)
{
if (!_portUtil.Operate)
{
if (SelectedChildMenu != null)
2023-11-13 11:52:43 +08:00
{
2024-11-05 08:49:56 +08:00
if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow"))
2023-11-13 11:52:43 +08:00
{
2024-11-05 08:49:56 +08:00
//定义传参变量
NavigationParameters keys = new NavigationParameters();
2023-11-13 11:52:43 +08:00
2024-11-05 08:49:56 +08:00
//添加参数,键值对格式
keys.Add("Type", 2);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("AddRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
2023-11-13 11:52:43 +08:00
2024-11-05 08:49:56 +08:00
//添加参数,键值对格式
keys.Add("Type", 1);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("ReturnRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
2023-11-13 11:52:43 +08:00
2024-11-05 08:49:56 +08:00
//添加参数,键值对格式
keys.Add("Type", 3);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("RetrunEmptyRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
2023-11-13 11:52:43 +08:00
2024-11-05 08:49:56 +08:00
//添加参数,键值对格式
keys.Add("Type", 3);
_regionManager.RequestNavigate("ContentRegion", SelectedChildMenu.PremissionPath, keys);
}
else if (SelectedChildMenu.PremissionPath.Equals("CheckRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
2023-11-13 11:52:43 +08:00
2024-11-05 08:49:56 +08:00
//添加参数,键值对格式
keys.Add("Type", 4);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else
{
if (SelectedChildMenu.PremissionPath.Equals("ReturnDrugWindow") || SelectedChildMenu.PremissionPath.Equals("ReturnDrugWindow2"))
2023-11-13 11:52:43 +08:00
{
2024-11-05 08:49:56 +08:00
if (ConfigurationManager.AppSettings["returnDrugMode"].ToString().Equals("1"))
{
_regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow2");
}
else
2023-11-13 11:52:43 +08:00
{
2024-11-05 08:49:56 +08:00
_regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow");
2023-11-13 11:52:43 +08:00
}
2024-11-05 08:49:56 +08:00
}
else if (SelectedChildMenu.PremissionPath.Equals("SettingMainWindow") || SelectedChildMenu.PremissionPath.Equals("SettingWindow"))
{
if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"]) > 0)
2024-07-08 11:44:31 +08:00
{
2024-11-05 08:49:56 +08:00
_regionManager.RequestNavigate("ContentRegion", "SettingMainWindow");
2024-07-08 11:44:31 +08:00
}
2023-11-13 11:52:43 +08:00
else
{
2024-11-05 08:49:56 +08:00
_regionManager.RequestNavigate("ContentRegion", "SettingWindow");
2023-11-13 11:52:43 +08:00
}
}
2024-11-05 08:49:56 +08:00
else
{
_regionManager.RequestNavigate("ContentRegion", SelectedChildMenu.PremissionPath);
}
2023-11-13 11:52:43 +08:00
}
}
}
}
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];
// }
//}
2023-11-13 11:52:43 +08:00
SetProperty(ref _selectedMenu, value);
}
}
private DelegateCommand _selectionCommon;
public DelegateCommand SelectionCommon
2023-11-13 11:52:43 +08:00
{
get => _selectionCommon ?? (_selectionCommon = new DelegateCommand(SelectionMethod));
2023-11-13 11:52:43 +08:00
}
private void SelectionMethod()
2023-11-13 11:52:43 +08:00
{
//SelectedMenu = viewName.SelectedItem as PremissionDm;
//if (SelectedMenu.PremissionName == "退出")
//{
// _chkFunction.HIKStopDVRRecord();
// logger.Info($"用户【{Operator?.Nickname}】退出登录");
// Operator = null;
// Reviewer = null;
// _regionManager.RequestNavigate("MainRegion", "LoginWindow");
//}
//else
//{
// //SelectedMenu.Children = SelectedMenu.Children;
// // SelectedChildMenu = SelectedMenu.Children[0];
// if (!_portUtil.Operate)
// {
// _regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
// }
//}
if (SelectedMenu != null && SelectedMenu.PremissionName == "退出")
{
bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
bool allTrue = Array.TrueForAll(boolArrs, b => b);
//false是关着,true是开着
if (!allTrue)
{
logger.Info($"用户【{Operator?.Nickname}】退出登录");
Operator = null;
Reviewer = null;
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
}
else
{
//还有药箱开着不能退出
AlertMsg alertMsg = new AlertMsg
{
Message = "请关闭药箱后再退出系统",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
2023-11-13 11:52:43 +08:00
}
else
{
//SelectedMenu.Children = SelectedMenu.Children;
//SelectedChildMenu = SelectedMenu.Children[0];
2024-11-05 08:49:56 +08:00
if (!_portUtil.Operate)
{
_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
}
2023-11-13 11:52:43 +08:00
}
}
2024-11-05 08:49:56 +08:00
#region
private DelegateCommand _selectionChildCommon;
public DelegateCommand SelectionChildCommon
{
get => _selectionChildCommon ?? (_selectionChildCommon = new DelegateCommand(SelectionChildMethod));
}
private void SelectionChildMethod()
{
SelectChildNavigate(SelectedChildMenu);
}
#endregion
2023-11-13 11:52:43 +08:00
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, CHKFunction cHKFunction)
2023-11-13 11:52:43 +08:00
{
_portUtil = portUtil;
_regionManager = iRegionManager;
_dialogService = dialogService;
_container = container;
this._eventAggregator = eventAggregator;
_chkFunction = cHKFunction;
2023-11-13 11:52:43 +08:00
}
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}");
// }
// });
//}
2023-11-13 11:52:43 +08:00
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)
2023-11-13 11:52:43 +08:00
.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();
}
2023-11-13 11:52:43 +08:00
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}℃";
// }
// }
//}
//保存温湿度信息
2024-08-13 17:05:27 +08:00
private async void GetWSD(object sender, ElapsedEventArgs e)
{
TemperatureHumidityInfo temp = _portUtil.GetWSD();
2024-08-13 17:05:27 +08:00
if (temp != null)
{
SqlSugarHelper.Db.Insertable(new TemperatureHumidityInfo()
{
GroupNo = temp.GroupNo,
Temp = temp.Temp,
Humi = temp.Humi,
AddTime = DateTime.Now
}).ExecuteCommand();
2024-08-13 17:05:27 +08:00
logger.Info($"保存温湿度信息:{temp.Temp},{temp.Humi}");
}
else
{
logger.Info("温湿度信息返回空");
}
}
/// <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}℃;";
2023-11-13 11:52:43 +08:00
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();
//}
2023-11-13 11:52:43 +08:00
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
_portUtil.dateTime = DateTime.Now;
2023-11-13 11:52:43 +08:00
//取出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("MainRegion", "LoginWindow");
});
AlertMsg alertMsg = new AlertMsg
{
Message = $"用户{UserList.Nickname}或还未设置权限,请联系管理员",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return;
}
2023-11-13 11:52:43 +08:00
//SqlSugarHelper.Db.SqlQueryable<PremissionDm>(sql)
//.ToTree(pd => pd.Children, pd => pd.ParentId, 0);
PremissionDmList = premissions;
SelectedMenu = premissions[0];
SelectedChildMenu = premissions[0].Children[0];
2024-11-05 08:49:56 +08:00
_regionManager.RequestNavigate("ContentRegion", premissions[0].Children[0].PremissionPath);
2023-11-13 11:52:43 +08:00
FindDrawerCount();
int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0");
int stopRecord = Convert.ToInt32(ConfigurationManager.AppSettings["stopRecord"] ?? "0");
2023-11-13 11:52:43 +08:00
if (autoExit > 0)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 100;
2023-11-13 11:52:43 +08:00
timer.Elapsed += (sender, e) =>
{
// 串口无人操作
bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
bool allTrue = Array.TrueForAll(boolArrs, b => b==false);
logger.Info($"进入自动退出定时方法{allTrue}");
//false是关着,true是开着
if (allTrue)
2023-11-13 11:52:43 +08:00
{
//PerformanceCounter pc = new PerformanceCounter("System", "% Idle Time", true);
//float systemIdleTime = pc.NextValue();
//Console.WriteLine($"systemIdleTime:{systemIdleTime}");
//// 获取系统空闲时间
//TimeSpan idleTime = SystemInformation.IdleTime;
//// 打印空闲时间
//Console.WriteLine("系统空闲时间: " + idleTime.ToString());
long lTime = CheckComputerFreeState.GetLastInputTime();
logger.Info($"自动退出时间{lTime}");
2023-11-13 11:52:43 +08:00
// 30秒内无人操作鼠标键盘
//if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > autoExit && CheckComputerFreeState.GetLastInputTime() > autoExit)
if (lTime > autoExit)
2023-11-13 11:52:43 +08:00
{
logger.Info($"设备{autoExit}秒内无人操作,用户【{Operator?.Nickname}】自动退出登录");
_chkFunction.HIKStopDVRRecord();
2023-11-13 11:52:43 +08:00
Operator = null;
Reviewer = null;
Application.Current.Dispatcher.Invoke(() =>
{
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
timer.Stop();
});
}
}
};
timer.Start();
}
#region
int interval = Convert.ToInt32(ConfigurationManager.AppSettings["Interval"]);
if (interval > 0)
{
WSDTimer = new System.Timers.Timer();
WSDTimer.Elapsed += new System.Timers.ElapsedEventHandler(GetWSD);
WSDTimer.Interval = interval;
WSDTimer.Start();
//WDTimer.AutoReset = true;
//WDTimer.Enabled = true;
}
#endregion
if (stopRecord > 0)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Elapsed += (sender, e) =>
{
//指定时间内无人操作鼠标键盘则停止录像
2024-07-08 11:44:31 +08:00
if (!_portUtil.Operate && CheckComputerFreeState.GetLastInputTime() > stopRecord)
{
_chkFunction.HIKStopDVRRecord();
}
};
timer.Start();
}
logger.Info($"当前时间:{DateTime.Now}\r\n获取录像机的时间");
//获取录像机的时间
_chkFunction.HIK_DVR_TIME();
_chkFunction.HIKStartDVRRecord();
2023-11-13 11:52:43 +08:00
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
}