From a82c9f1cd18ef8805536647aedb0ea162f5d58c3 Mon Sep 17 00:00:00 2001 From: maqiao <625215135@qq.com> Date: Fri, 6 Dec 2024 17:51:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E8=8D=AF=E7=AE=B1=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=85=B3=E5=90=8E=E6=89=8D=E8=83=BD=E5=86=8D=E6=AC=A1=E6=89=93?= =?UTF-8?q?=E5=BC=80=EF=BC=8C=E5=8E=BB=E6=8E=89=E5=AE=9A=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DM_Weight/Finger/FingerprintUtil.cs | 24 ++- DM_Weight/Models/IpAndPort.cs | 17 ++ DM_Weight/Port/KeepAliveSocket.cs | 72 ++++++++ DM_Weight/Port/ModbusHelper.cs | 147 ++++++++-------- .../CheckOrderNewWindowViewModel.cs | 158 +++++++++++------- DM_Weight/ViewModels/HomeWindowViewModel.cs | 97 ++++++----- DM_Weight/ViewModels/LoginWindowViewModel.cs | 5 +- .../ViewModels/OpenBoxNewWindowViewModel.cs | 152 ++++++++++------- .../ViewModels/SettingBoxWindowViewModel.cs | 31 +++- DM_Weight/Views/HomeWindow.xaml.cs | 8 +- DM_Weight/Views/OpenBoxNewWindow.xaml | 2 +- 11 files changed, 474 insertions(+), 239 deletions(-) create mode 100644 DM_Weight/Models/IpAndPort.cs create mode 100644 DM_Weight/Port/KeepAliveSocket.cs diff --git a/DM_Weight/Finger/FingerprintUtil.cs b/DM_Weight/Finger/FingerprintUtil.cs index 349ff39..bb861c1 100644 --- a/DM_Weight/Finger/FingerprintUtil.cs +++ b/DM_Weight/Finger/FingerprintUtil.cs @@ -20,7 +20,7 @@ namespace DM_Weight.Finger { private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintUtil)); - public zkemkeeper.CZKEMClass axCZKEM1; //= new zkemkeeper.CZKEMClass(); + public zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass(); public bool bIsConnected = false; private string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString(); @@ -42,12 +42,12 @@ namespace DM_Weight.Finger { try { - axCZKEM1 = new CZKEMClass(); + //axCZKEM1 = new CZKEMClass(); bIsConnected = axCZKEM1.Connect_Net(fingerIp, fingerPort); logger.Info($"连接指纹机,IP:{fingerIp},端口:{fingerPort},机器号:{machineNumber},连接结果:{bIsConnected}"); if (bIsConnected) { - if (axCZKEM1.RegEvent(machineNumber, 65535)) + if (axCZKEM1.RegEvent(machineNumber, 9)) { this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); //this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger); @@ -67,6 +67,24 @@ namespace DM_Weight.Finger logger.Info($"连接指纹机异常{ex.Message.ToString()}"); } } + /// + /// 用于退出登录重连指纹机 + /// + public void FingerDisconnect() + { + try + { + axCZKEM1.Disconnect(); + this.axCZKEM1.OnAttTransactionEx -= new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); + this.axCZKEM1.OnEnrollFingerEx -= new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx); + ConnectionMain(); + } + catch (Exception ex) + { + logger.Info($"指纹机Disconnect异常{ex.Message.ToString()}"); + ConnectionMain(); + } + } //If your fingerprint(or your card) passes the verification,this event will be triggered private void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode) diff --git a/DM_Weight/Models/IpAndPort.cs b/DM_Weight/Models/IpAndPort.cs new file mode 100644 index 0000000..185033e --- /dev/null +++ b/DM_Weight/Models/IpAndPort.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DM_Weight.Models +{ + /// + /// 记录系统中网口通信中用到的ip与端口号 + /// + public class IpAndPort + { + public string Ip { get; set; } + public int Port { get; set; } + } +} diff --git a/DM_Weight/Port/KeepAliveSocket.cs b/DM_Weight/Port/KeepAliveSocket.cs new file mode 100644 index 0000000..73fe290 --- /dev/null +++ b/DM_Weight/Port/KeepAliveSocket.cs @@ -0,0 +1,72 @@ +using Polly; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using DM_Weight.Models; +using DM_Weight.ViewModels; +using log4net; + +namespace DM_Weight.Port +{ + public class KeepAliveSocket + { + /// + /// 生成带有心跳检测的socket + /// + public class KeepALiveSocket + { + + private static ILog socketLogger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel)); + public static Socket MakeKeepALiveSocket(string ip, int port) + { + uint dummy = 0; + byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; + BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);//启用Keep-Alive + BitConverter.GetBytes((uint)10000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));//在这个时间间隔内没有数据交互,则发送探测包 + BitConverter.GetBytes((uint)10000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);//发探测包时间间隔 + IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port); + Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + _socket = Policy.Handle() + .Retry(3, (exception, retryCount) => { + socketLogger.Info($"建立Socket,第{retryCount}次重试", exception); + // return TimeSpan.FromSeconds (1); + }) + .Execute(() => { + _socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); + _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); + _socket.Connect(iep); + return _socket; + }); + return _socket; + } + public static Socket MakeKeepALiveSocket(IpAndPort ipAndPort) + { + uint dummy = 0; + byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; + BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);//启用Keep-Alive + BitConverter.GetBytes((uint)10000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));//在这个时间间隔内没有数据交互,则发送探测包 + BitConverter.GetBytes((uint)10000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);//发探测包时间间隔 + IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ipAndPort.Ip), ipAndPort.Port); + Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + _socket = Policy.Handle() + .Retry(3, (exception, retryCount) => { + socketLogger.Info($"建立Socket,第{retryCount}次重试", exception); + // return TimeSpan.FromSeconds (1); + }) + .Execute(() => { + _socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); + _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); + _socket.Connect(iep); + return _socket; + }); + return _socket; + } + + } + } +} diff --git a/DM_Weight/Port/ModbusHelper.cs b/DM_Weight/Port/ModbusHelper.cs index b058017..648e9a4 100644 --- a/DM_Weight/Port/ModbusHelper.cs +++ b/DM_Weight/Port/ModbusHelper.cs @@ -1,8 +1,10 @@ -using DM_Weight.ViewModels; +using DM_Weight.msg; +using DM_Weight.ViewModels; using log4net; using log4net.Repository.Hierarchy; using Modbus.Device; using Polly; +using Prism.Events; using System; using System.Collections.Generic; using System.Configuration; @@ -11,23 +13,28 @@ using System.Linq; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; +using System.Speech.Synthesis; using System.Text; using System.Threading; using System.Threading.Tasks; +using static DM_Weight.Port.KeepAliveSocket; namespace DM_Weight.Port { public class ModbusHelper { + private static ModbusHelper instance; private ModbusIpMaster master; private Socket socket; private TcpClient client; - private static ModbusHelper instance; - //private static readonly object objLock = new object(); private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel)); + string ip = ConfigurationManager.AppSettings["modbusIp"].ToString(); + int port = Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]); + public static bool BoxOperate { get; set; } private ModbusHelper() { - socket = MakeKeepALiveSocket(); + logger.Info("ModbusHelper"); + socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port); client = new TcpClient(); client.Client = socket; master = ModbusIpMaster.CreateIp(client); @@ -35,14 +42,6 @@ namespace DM_Weight.Port } public static ModbusHelper GetInstance() { - //if (instance == null) - //{ - // lock (objLock) - // { - // if (instance == null) - // instance = new ModbusHelper(); - // } - //} if (instance == null) { instance = new ModbusHelper(); @@ -51,52 +50,79 @@ namespace DM_Weight.Port } private void SetModusIpMaster() { - Debug.WriteLine("SetModusIpMaster"); - socket = MakeKeepALiveSocket(); + logger.Info("SetModusIpMaster"); + socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port); ; client = new TcpClient(); client.Client = socket; master = ModbusIpMaster.CreateIp(client); } + public bool[] GetAllBoxState() { - if (ConfigurationManager.AppSettings["test"] != null && ConfigurationManager.AppSettings["test"].ToString() == "Y") - { - return new bool[] { false,false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}; - } - bool[] bools = Policy.Handle() - .Retry(3, (exception, retryCount) => - { - this.Dispose(); - //Debug.WriteLine($"获取所有箱子门状态出错,第{retryCount}次重试", exception); - logger.Info($"获取所有箱子门状态出错,第{retryCount}次重试, 异常信息{exception}"); - Thread.Sleep(50); - this.SetModusIpMaster(); - // return TimeSpan.FromSeconds (1); - }).Execute(() => - { - bool[] flags = new bool[18]; - var result = master.ReadInputRegisters(1, 0x0033, 2); - var r1 = Convert.ToString(((int)result[0] >> 14) | ((int)result[1] << 2), 2).PadLeft(18, '0'); - var r2 = r1.ToCharArray(); - Debug.WriteLine("r2=>" + string.Join(", ", r2)); - for (int i = 0; i < 18; i++) + //bool[] bools = { true }; + //if (BoxOperate) + //{ + //if (ConfigurationManager.AppSettings["test"] != null && ConfigurationManager.AppSettings["test"].ToString() == "Y") + //{ + // return new bool[] { false,false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}; + //} + bool[] bools = Policy.Handle() + .Retry(3, (exception, retryCount) => { - flags[i] = r2[17 - i] == '1' ? true : false; - } - logger.Info($"获取所有箱子门状态返回:{string.Join(',',flags)}"); - Thread.Sleep(50); - return flags; - }); + this.Dispose(); + //Debug.WriteLine($"获取所有箱子门状态出错,第{retryCount}次重试", exception); + logger.Info($"获取所有箱子门状态出错,第{retryCount}次重试, 异常信息{exception}"); + Thread.Sleep(50); + this.SetModusIpMaster(); + BoxOperate = false; + // return TimeSpan.FromSeconds (1); + }).Execute(() => + { + bool[] flags = new bool[18]; + if(master==null) + { + this.SetModusIpMaster(); + } + var result = master.ReadInputRegisters(1, 0x0033, 2); + var r1 = Convert.ToString(((int)result[0] >> 14) | ((int)result[1] << 2), 2).PadLeft(18, '0'); + var r2 = r1.ToCharArray(); + logger.Info("r2=>" + string.Join(", ", r2)); + //var r2=new char[18] { '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' }; + for (int i = 0; i < 18; i++) + { + flags[i] = r2[17 - i] == '1' ? true : false; + } + logger.Info($"获取所有箱子门状态返回:{string.Join(',', flags)};"); + //bool allFalse = Array.TrueForAll(flags, b => b == false); + //if (!allFalse) + //{ + // Task.Delay(500); + // Task.Factory.StartNew(async () => + // { + // SpeakAsync("药箱已打开,请及时关闭"); + // await Task.Delay(15000); + // }); + //} + //else + //{ + // BoxOperate = false; + //} + + return flags; + }); + //} return bools; } public bool OpenBoxDoor(int boxNum) { - if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y") - { - return true; - } - bool bFlag=false; + BoxOperate = true; + //if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y") + //{ + // return true; + //} + bool bFlag = false; + Thread.Sleep(50); Policy.Handle().Retry(3, ((exception, retryCount) => { this.Dispose(); @@ -110,6 +136,7 @@ namespace DM_Weight.Port logger.Info($"正在打开{boxNum}号药箱"); master.WriteSingleRegister(1, (ushort)boxNum, 14); logger.Info($"开门指令已发送{(ushort)boxNum}"); + SpeakAsync("药箱已打开,请及时关闭"); //Console.WriteLine($"开门指令已发送{(ushort)boxNum}"); bFlag = true; }); @@ -122,32 +149,10 @@ namespace DM_Weight.Port client.Close(); master.Dispose(); } - public static Socket MakeKeepALiveSocket() + private static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(); + public static void SpeakAsync(string textinfo) { - uint dummy = 0; - byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; - BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);//启用Keep-Alive - BitConverter.GetBytes((uint)10000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));//在这个时间间隔内没有数据交互,则发送探测包 - BitConverter.GetBytes((uint)10000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);//发探测包时间间隔 - //IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.13"), 502); - string modbusIp = ConfigurationManager.AppSettings["modbusIp"].ToString(); - int modbusPort =Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]); - IPEndPoint iep = new IPEndPoint(IPAddress.Parse(modbusIp), modbusPort); - Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - _socket = Policy.Handle() - .Retry(3, (exception, retryCount) => - { - Console.WriteLine($"建立Socket,第{retryCount}次重试", exception); - // return TimeSpan.FromSeconds (1); - }) - .Execute(() => - { - _socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); - _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); - _socket.Connect(iep); - return _socket; - }); - return _socket; + speechSynthesizer.SpeakAsync(textinfo); } } } diff --git a/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs b/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs index 8a828d1..5f81c6a 100644 --- a/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs @@ -454,72 +454,75 @@ namespace DM_Weight.ViewModels } } } - List chlList = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5").ToList();//.Select(cl => cl.BelongUser).First(); - if (chlList != null && chlList.Count > 0) + else { - for (int i = 0; i < chlList.Count; i++) + List chlList = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5").ToList();//.Select(cl => cl.BelongUser).First(); + if (chlList != null && chlList.Count > 0) { - ChannelList chl = chlList[i]; - if (Convert.ToDateTime(chl.EffDate).ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd")) + for (int i = 0; i < chlList.Count; i++) { - switch (chl.DrawerNo) + ChannelList chl = chlList[i]; + if (Convert.ToDateTime(chl.EffDate).ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd")) { - case 1: - Button1Color = Brushes.Yellow; - break; - case 2: - Button2Color = Brushes.Yellow; - break; - case 3: - Button3Color = Brushes.Yellow; - break; - case 4: - Button4Color = Brushes.Yellow; - break; - case 5: - Button5Color = Brushes.Yellow; - break; - case 6: - Button6Color = Brushes.Yellow; - break; - case 7: - Button7Color = Brushes.Yellow; - break; - case 8: - Button8Color = Brushes.Yellow; - break; - case 9: - Button9Color = Brushes.Yellow; - break; - case 10: - Button10Color = Brushes.Yellow; - break; - case 11: - Button11Color = Brushes.Yellow; - break; - case 12: - Button12Color = Brushes.Yellow; - break; - case 13: - Button13Color = Brushes.Yellow; - break; - case 14: - Button14Color = Brushes.Yellow; - break; - case 15: - Button15Color = Brushes.Yellow; - break; - case 16: - Button16Color = Brushes.Yellow; - break; - case 17: - Button17Color = Brushes.Yellow; - break; - case 18: - Button18Color = Brushes.Yellow; - break; - default: - break; + switch (chl.DrawerNo) + { + case 1: + Button1Color = Brushes.Yellow; + break; + case 2: + Button2Color = Brushes.Yellow; + break; + case 3: + Button3Color = Brushes.Yellow; + break; + case 4: + Button4Color = Brushes.Yellow; + break; + case 5: + Button5Color = Brushes.Yellow; + break; + case 6: + Button6Color = Brushes.Yellow; + break; + case 7: + Button7Color = Brushes.Yellow; + break; + case 8: + Button8Color = Brushes.Yellow; + break; + case 9: + Button9Color = Brushes.Yellow; + break; + case 10: + Button10Color = Brushes.Yellow; + break; + case 11: + Button11Color = Brushes.Yellow; + break; + case 12: + Button12Color = Brushes.Yellow; + break; + case 13: + Button13Color = Brushes.Yellow; + break; + case 14: + Button14Color = Brushes.Yellow; + break; + case 15: + Button15Color = Brushes.Yellow; + break; + case 16: + Button16Color = Brushes.Yellow; + break; + case 17: + Button17Color = Brushes.Yellow; + break; + case 18: + Button18Color = Brushes.Yellow; + break; + default: + break; + } } } } @@ -821,6 +824,18 @@ namespace DM_Weight.ViewModels public void OpenBoxAction(string strDrawerNo) { + //bool[] bools = ModbusHelper.GetInstance().GetAllBoxState(); + //bool allFalse = Array.TrueForAll(bools, b => b == false); + //if (!allFalse) + //{ + // Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); + // return; + //} + if (ModbusHelper.BoxOperate) + { + Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); + return; + } DrawerNo = Convert.ToInt32(strDrawerNo); MachineRecord machineRecord = new MachineRecord(); machineRecord.MachineId = "DM5"; @@ -840,6 +855,25 @@ namespace DM_Weight.ViewModels //记录开药箱日志 SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand(); ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo); + Task.Factory.StartNew(async () => + { + bool loop = true; + while (loop) + { + await Task.Delay(9000); + bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); + bool state = Array.TrueForAll(boolsl, b => b == false); + if (state) + { + loop = false; + ModbusHelper.BoxOperate = false; + } + else + { + ModbusHelper.SpeakAsync("药箱已打开,请及时关闭"); + } + } + }); } } diff --git a/DM_Weight/ViewModels/HomeWindowViewModel.cs b/DM_Weight/ViewModels/HomeWindowViewModel.cs index 8f0c821..d5029ab 100644 --- a/DM_Weight/ViewModels/HomeWindowViewModel.cs +++ b/DM_Weight/ViewModels/HomeWindowViewModel.cs @@ -37,20 +37,20 @@ namespace DM_Weight.ViewModels private UserList? _userList2; - /// - /// 冰箱温度 - /// - private string _wd = "恒温冷藏抽屉当前温度2.8(非真实数据)"; - public string WD { get => _wd; set => SetProperty(ref _wd, value); } - System.Timers.Timer WDTimer; + ///// + ///// 冰箱温度 + ///// + //private string _wd = "恒温冷藏抽屉当前温度2.8(非真实数据)"; + //public string WD { get => _wd; set => SetProperty(ref _wd, value); } + //System.Timers.Timer WDTimer; - System.Timers.Timer WSDTimer; + //System.Timers.Timer WSDTimer; - /// - /// 是否有冰箱抽屉 - /// - private string hasFridge = ConfigurationManager.AppSettings["hasFridge"].ToString().Equals("1") ? "Visible" : "Collapsed"; - public string HasFridge { get => hasFridge; set => SetProperty(ref hasFridge, value); } + ///// + ///// 是否有冰箱抽屉 + ///// + //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 @@ -148,7 +148,7 @@ namespace DM_Weight.ViewModels // } // } // } - SetProperty(ref _selectedChildMenu, value); + SetProperty(ref _selectedChildMenu, value); //} } } @@ -287,10 +287,10 @@ namespace DM_Weight.ViewModels //} if (SelectedMenu != null && SelectedMenu.PremissionName == "退出") { - bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); - bool allTrue = Array.TrueForAll(boolArrs, b => b); + //bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); + //bool allTrue = Array.TrueForAll(boolArrs, b => b); //false是关着,true是开着 - if (!allTrue) + if (!ModbusHelper.BoxOperate) { logger.Info($"用户【{Operator?.Nickname}】退出登录"); Operator = null; @@ -300,12 +300,8 @@ namespace DM_Weight.ViewModels else { //还有药箱开着不能退出 - AlertMsg alertMsg = new AlertMsg - { - Message = "请关闭药箱后再退出系统", - Type = MsgType.ERROR - }; - _eventAggregator.GetEvent().Publish(alertMsg); + _portUtil.SpeakAsync("请关闭药箱后再退出"); + SelectedMenu = _premissionDmList[0]; } } else @@ -346,7 +342,8 @@ namespace DM_Weight.ViewModels private PortUtil _portUtil; //private CHKFunction _chkFunction; IEventAggregator _eventAggregator; - public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IDialogService dialogService, IUnityContainer container, IEventAggregator eventAggregator) + //private ModbusHelper _modbusHelper; + public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IUnityContainer container, IDialogService dialogService, IEventAggregator eventAggregator) { _portUtil = portUtil; _regionManager = iRegionManager; @@ -354,6 +351,7 @@ namespace DM_Weight.ViewModels _container = container; this._eventAggregator = eventAggregator; //_chkFunction = cHKFunction; + //_modbusHelper = modbusHelper; } public DelegateCommand OpenFingerDialog @@ -546,10 +544,10 @@ namespace DM_Weight.ViewModels { Operator = null; Reviewer = null; - Application.Current.Dispatcher.Invoke(() => - { - _regionManager.RequestNavigate("MainRegion", "LoginWindow"); - }); + //Application.Current.Dispatcher.Invoke(() => + //{ + _regionManager.RequestNavigate("MainRegion", "LoginWindow"); + //}); AlertMsg alertMsg = new AlertMsg { Message = $"用户{UserList.Nickname}或还未设置权限,请联系管理员", @@ -611,17 +609,40 @@ namespace DM_Weight.ViewModels // timer.Start(); //} #region 温度查询定时 - int interval = Convert.ToInt32(ConfigurationManager.AppSettings["Interval"]); - if (interval > 0) - { - WSDTimer = new System.Timers.Timer(); + //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; - } + // WSDTimer.Elapsed += new System.Timers.ElapsedEventHandler(GetWSD); + // WSDTimer.Interval = interval; + // WSDTimer.Start(); + // //WDTimer.AutoReset = true; + // //WDTimer.Enabled = true; + //} + Task.Factory.StartNew(async () => + { + while (true) + { + TemperatureHumidityInfo temp = _portUtil.GetWSD(); + if (temp != null) + { + SqlSugarHelper.Db.Insertable(new TemperatureHumidityInfo() + { + GroupNo = temp.GroupNo, + Temp = temp.Temp, + Humi = temp.Humi, + AddTime = DateTime.Now + }).ExecuteCommand(); + logger.Info($"保存温湿度信息:{temp.Temp},{temp.Humi}"); + await Task.Delay(1200000);//20分钟查一次 + } + else + { + logger.Info("温湿度信息返回空"); + } + } + }); #endregion //if (stopRecord > 0) //{ @@ -663,7 +684,7 @@ namespace DM_Weight.ViewModels Reviewer = null; //Application.Current.Dispatcher.Invoke(() => //{ - _regionManager.RequestNavigate("MainRegion", "LoginWindow"); + _regionManager.RequestNavigate("MainRegion", "LoginWindow"); //}); } diff --git a/DM_Weight/ViewModels/LoginWindowViewModel.cs b/DM_Weight/ViewModels/LoginWindowViewModel.cs index 0e36963..af35290 100644 --- a/DM_Weight/ViewModels/LoginWindowViewModel.cs +++ b/DM_Weight/ViewModels/LoginWindowViewModel.cs @@ -120,9 +120,10 @@ namespace DM_Weight.ViewModels _portUtil = portUtil; _regionManager = regionManager; _eventAggregator = eventAggregator; - FingerMsg = !_fingerprintUtil.bIsConnected; + FingerMsg = _fingerprintUtil.bIsConnected; _eventAggregator.GetEvent().Subscribe(LoginEvent); - logger.Info("LoginWindowViewModel"); + logger.Info($"LoginWindowViewModel;FingerMsg:{FingerMsg}"); + _fingerprintUtil.FingerDisconnect(); } private DelegateCommand? _loginCommand; diff --git a/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs b/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs index 531f37c..a04f521 100644 --- a/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs +++ b/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs @@ -25,8 +25,8 @@ namespace DM_Weight.ViewModels public class OpenBoxNewWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime { //定时查询药箱状态 - System.Timers.Timer StateTimer = new System.Timers.Timer(15000); - + //System.Timers.Timer StateTimer = new System.Timers.Timer(5000); + private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel)); private int _drawerType = -1; @@ -54,8 +54,8 @@ namespace DM_Weight.ViewModels //开公共药箱按钮的显示状态 - private bool _publicEnable = true; - public bool PublicEnable { get => _publicEnable; set => SetProperty(ref _publicEnable, value); } + //private bool _publicEnable = true; + //public bool PublicEnable { get => _publicEnable; set => SetProperty(ref _publicEnable, value); } //公共药箱按钮显示内容 private string _publicContent; @@ -110,11 +110,10 @@ namespace DM_Weight.ViewModels public static ChannelList iList = new ChannelList(); //第几个抽屉号 //public static int iNumber = 1; - private PortUtil _portUtil; + //private PortUtil _portUtil; IEventAggregator _eventAggregator; - public OpenBoxNewWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator) + public OpenBoxNewWindowViewModel(IEventAggregator eventAggregator) { - _portUtil = portUtil; _eventAggregator = eventAggregator; } #region 抽屉按钮 @@ -581,32 +580,32 @@ namespace DM_Weight.ViewModels //int listSelfState = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5") // .WhereIf(cl => cl.BelongUser == HomeWindowViewModel.Operator.UserBarcode).Select(cl => cl.DrawerState).First(); - int listDrawerState = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType) - .WhereIF(this.DrawerType == 0, cl => cl.BelongUser == HomeWindowViewModel.Operator.UserBarcode).Select(cl => cl.DrawerState).First(); - if (DrawerType == 1) //公共药箱 - { - if (listDrawerState == 0) - { - SelfContent = "还公共药箱"; - } - else - { - SelfContent = "取公共药箱"; - } + //int listDrawerState = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType) + // .WhereIF(this.DrawerType == 0, cl => cl.BelongUser == HomeWindowViewModel.Operator.UserBarcode).Select(cl => cl.DrawerState).First(); + //if (DrawerType == 1) //公共药箱 + //{ + // if (listDrawerState == 0) + // { + // SelfContent = "还公共药箱"; + // } + // else + // { + // SelfContent = "取公共药箱"; + // } - } - else - { - if (listDrawerState == 0) - { - SelfContent = "还名下药箱"; - } - else - { - SelfContent = "取名下药箱"; - } + //} + //else + //{ + // if (listDrawerState == 0) + // { + // SelfContent = "还名下药箱"; + // } + // else + // { + // SelfContent = "取名下药箱"; + // } - } + //} } public DelegateCommand OpenBoxDelegate @@ -619,6 +618,14 @@ namespace DM_Weight.ViewModels } private void SearchBox() { + //bool[] bools = ModbusHelper.GetInstance().GetAllBoxState(); + //bool allFalse = Array.TrueForAll(bools, b => b == false); + //if (!allFalse) + if (ModbusHelper.BoxOperate) + { + Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); + return; + } iList = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType && cl.DrawerNo == DrawerNo) .WhereIF(this.DrawerType == 0, cl => cl.BelongUser == HomeWindowViewModel.Operator.UserBarcode).First(); // .Select(cl => cl.DrawerNo).ToList(); @@ -648,44 +655,76 @@ namespace DM_Weight.ViewModels channelList.DrawerState = SelfContent.Substring(0, 1) == "取" ? 0 : 1; SqlSugarHelper.Db.Updateable(channelList).UpdateColumns(it => new { it.EffDate, it.DrawerState }).ExecuteCommand(); - StateTimer.Elapsed += OnTimerElapsed; - if (StateTimer.Enabled) + //StateTimer.Elapsed += OnTimerElapsed; + //if (StateTimer.Enabled) + //{ + // StateTimer.Stop(); + // logger.Info($"停止定时查询状态方法"); + // Thread.Sleep(100); + //} + //else { - StateTimer.Stop(); - logger.Info($"停止定时查询状态方法"); - Thread.Sleep(1000); - } - else - { - _portUtil.SpeakAsync($"正在打开{DrawerNo}号药箱"); + ModbusHelper.SpeakAsync($"正在打开{DrawerNo}号药箱"); } + //ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1); ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1); - Thread.Sleep(15000); - StateTimer.Start(); + + Task.Factory.StartNew(async() => + { + bool loop = true; + while (loop) + { + await Task.Delay(9000); + bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); + bool state = Array.TrueForAll(boolsl, b => b == false); + if(state) + { + loop = false; + ModbusHelper.BoxOperate = false; + } + else + { + ModbusHelper.SpeakAsync("药箱已打开,请及时关闭"); + } + } + }); + + + //StateTimer.Start(); SelfStatus = 0; - PublicEnable = true; - SelfEnable = true; + //PublicEnable = true; + //SelfEnable = true; DrawerType = -1; } } - private void OnTimerElapsed(object sender, ElapsedEventArgs e) + //private void OnTimerElapsed(object sender, ElapsedEventArgs e) + //{ + // bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); + // bool allTrue = Array.TrueForAll(boolArrs, b => b == false); + // logger.Info($"进入定时查询状态方法{allTrue}"); + // if (allTrue) + // { + // //药箱全部关闭,停止查询 + // StateTimer.Stop(); + // } + // else + // { + // _portUtil.SpeakAsync("药箱已打开,请及时关闭"); + // //Console.Beep(800, 1100); + // } + //} + void DoMyPrismEvent(DeviceMsg msg) { - bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); - bool allTrue = Array.TrueForAll(boolArrs, b => b == false); - logger.Info($"进入定时查询状态方法{allTrue}"); - if (allTrue) + switch (msg.EventType) { - //药箱全部关闭,停止查询 - StateTimer.Stop(); - } - else - { - _portUtil.SpeakAsync("药箱已打开,请及时关闭"); - //Console.Beep(800, 1100); + case EventType.DRAWERCLOSE: + SelfEnable = false; + break; } } public void OnNavigatedTo(NavigationContext navigationContext) { + _eventAggregator.GetEvent().Subscribe(DoMyPrismEvent); RequestData(); } @@ -696,6 +735,7 @@ namespace DM_Weight.ViewModels public void OnNavigatedFrom(NavigationContext navigationContext) { + _eventAggregator.GetEvent().Unsubscribe(DoMyPrismEvent); } } } diff --git a/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs b/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs index 0c2f2a2..c95a3d6 100644 --- a/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs +++ b/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs @@ -198,6 +198,14 @@ namespace DM_Weight.ViewModels { if (DrawerNo > 0) { + //bool[] bools = ModbusHelper.GetInstance().GetAllBoxState(); + //bool allFalse = Array.TrueForAll(bools, b => b == false); + //if (!allFalse) + if (ModbusHelper.BoxOperate) + { + Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); + return; + } IsEnable = false; Status = 1; //_portUtil.SpeakAsync("正在打开药箱"); @@ -213,12 +221,31 @@ namespace DM_Weight.ViewModels Type = 55, InvoiceId = $"打开{DrawerNo}号药箱", }).ExecuteCommand(); - bool bFlag = ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1); - if (bFlag) + ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1); + //if (bFlag) { IsEnable = true; Status = 0; } + Task.Factory.StartNew(async () => + { + bool loop = true; + while (loop) + { + await Task.Delay(9000); + bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); + bool state = Array.TrueForAll(boolsl, b => b == false); + if (state) + { + loop = false; + ModbusHelper.BoxOperate = false; + } + else + { + ModbusHelper.SpeakAsync("药箱已打开,请及时关闭"); + } + } + }); } }); } diff --git a/DM_Weight/Views/HomeWindow.xaml.cs b/DM_Weight/Views/HomeWindow.xaml.cs index 841f3bc..c046a3c 100644 --- a/DM_Weight/Views/HomeWindow.xaml.cs +++ b/DM_Weight/Views/HomeWindow.xaml.cs @@ -55,10 +55,10 @@ namespace DM_Weight.Views private void OnTimerElapsed(object sender, ElapsedEventArgs e) { // 串口无人操作 - bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); - bool allTrue = Array.TrueForAll(boolArrs, b => b == false); - logger.Info($"进入自动退出定时方法{allTrue}"); - if (allTrue&&idleTimer.Enabled) + //bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); + //bool allTrue = Array.TrueForAll(boolArrs, b => b == false); + logger.Info($"进入自动退出定时方法{ModbusHelper.BoxOperate}"); + if (ModbusHelper.BoxOperate && idleTimer.Enabled) { idleTimer.Stop(); //无人操作,自动退出 diff --git a/DM_Weight/Views/OpenBoxNewWindow.xaml b/DM_Weight/Views/OpenBoxNewWindow.xaml index 308e3b4..b96f8e0 100644 --- a/DM_Weight/Views/OpenBoxNewWindow.xaml +++ b/DM_Weight/Views/OpenBoxNewWindow.xaml @@ -19,7 +19,7 @@ - +