using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using OracleInternal.Sharding; using ServiceStack; using SlnMesnac.Business; using SlnMesnac.Business.@base; using SlnMesnac.Config; using SlnMesnac.Plc; using SlnMesnac.TouchSocket; using SlnMesnac.WPF.Page; using SlnMesnac.WPF.Page.Generate; using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Timers; using System.Windows; using System.Windows.Threading; namespace SlnMesnac.WPF.ViewModel { public class MainWindowViewModel : ViewModelBase { private readonly ILogger _logger; private readonly DebugConfig debugConfig = DebugConfig.Instance; private readonly DevMonitorPage devMonitorPage = new DevMonitorPage(); private readonly ProdMgmtPage prodMgmtPage = new ProdMgmtPage(); private readonly ProdStatisticsPage prodStatisticsPage = new ProdStatisticsPage(); //代码生成 private readonly GenerateControl generateControl = new GenerateControl(); private readonly BaseConfigInfoPage configInfoPage = new BaseConfigInfoPage(); private readonly RecipeManagePage recipeManagePage = new RecipeManagePage(); private readonly AgvAndTaskMonitorPage agvAndTaskMonitorPage = new AgvAndTaskMonitorPage(); private System.Timers.Timer timer = new System.Timers.Timer(1000 * 5); PlcAbsractFactory? plc = null; private BaseBusiness? baseBusiness = null; #region 参数定义 private string _Date; public string Date { get { return _Date; } set { _Date = value; RaisePropertyChanged(nameof(Date)); } } private string _ModeName; public string ModeName { get { return _ModeName; } set { _ModeName = value; RaisePropertyChanged(nameof(ModeName)); } } private string _PageName; public string PageName { get { return _PageName; } set { _PageName = value; RaisePropertyChanged(nameof(PageName)); } } /// /// PLC设备状态 /// private int _PlcStatus = 0; public int PlcStatus { get { return _PlcStatus; } set { _PlcStatus = value; RaisePropertyChanged(nameof(PlcStatus)); } } /// /// 喷码机状态 /// private int _PmStatus = 0; public int PmStatus { get { return _PmStatus; } set { _PmStatus = value; RaisePropertyChanged(nameof(PmStatus)); } } /// /// RFID1状态 /// private int _Out2FRfidStatus = 0; public int Out2FRfidStatus { get { return _Out2FRfidStatus; } set { _Out2FRfidStatus = value; RaisePropertyChanged(nameof(Out2FRfidStatus)); } } public System.Windows.Controls.UserControl _content; public System.Windows.Controls.UserControl UserContent { get { return _content; } set { _content = value; RaisePropertyChanged(nameof(UserContent)); } } #endregion #region 事件定义 /// /// 界面跳转按钮事件 /// public RelayCommand ControlOnClickCommand { get; set; } /// /// 打开系统键盘 /// public RelayCommand OpenSystemKeyboardCommand { get; set; } /// /// 窗体控制 /// public RelayCommand FormControlCommand { get; set; } #endregion public MainWindowViewModel() { _logger = App.ServiceProvider.GetService>(); UserContent = prodMgmtPage; PageName = "京源环保SCADA"; debugConfig.ProductMode = "1"; ControlOnClickCommand = new RelayCommand(obj => ControlOnClick(obj)); FormControlCommand = new RelayCommand(x => FormControl(x)); baseBusiness = App.ServiceProvider.GetService(); plc = baseBusiness.GetPlcByKey("plc"); StartLiseningStatus(); checkStatus(); RefreshTime(); } private void RefreshTime() { DispatcherTimer _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromSeconds(1); _timer.Tick += Timer_Tick; _timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { Date = DateTime.Now.ToString("yyyy年MM月dd日:HH:mm:ss"); ModeName = debugConfig.ProductMode == "1" ? "投料模式 : 手动模式" : "投料模式 : 自动模式"; } #region 监听外部设备状态:PLC、喷码机、RFID /// /// 监听外部设备状态:PLC、喷码机、RFID /// private void StartLiseningStatus() { timer.Elapsed += new System.Timers.ElapsedEventHandler(LiseningStatus); timer.AutoReset = true; timer.Enabled = true; timer.Start(); } private void LiseningStatus(object? sender, ElapsedEventArgs e) { timer.Stop(); checkStatus(); timer.Start(); } /// /// 检查设备状态 /// private void checkStatus() { try { #region PLC状态 if (plc != null && plc.IsConnected) { plc.IsConnected = plc.readHeartByAddress("M100"); PlcStatus = 1; } else { PlcStatus = 2; PlcConfig? plcConfig = App.ServiceProvider.GetService().plcConfig.FirstOrDefault(x => x.plcKey == "plc"); if (plcConfig != null) { bool result = plc.Connect(plcConfig.plcIp, plcConfig.plcPort); plc.IsConnected = result; } } #endregion #region 喷码机状态 if (ProdCompletionBusiness.PmTryAmount == 0) { PmStatus = 1; } else { PmStatus = 2; } #endregion #region RFID状态 var rfidEquip = baseBusiness.GetRfidByKey("secondFloorOut"); if (rfidEquip != null) { Out2FRfidStatus = 1; } else { Out2FRfidStatus = 2; } #endregion } catch (Exception ex) { _logger.LogError($"监听设备状态异常:{ex.Message}"); } } #endregion /// /// 窗体控制 /// /// private void FormControl(object obj) { try { string controlType = obj as string; switch (controlType) { case "DevMonitor": UserContent = devMonitorPage; PageName = "设备监控"; break; case "ProdMgmt": UserContent = prodMgmtPage; PageName = "京源环保SCADA"; break; case "ManualDelivery": //UserContent = manualDelivery; ManualDeliveryWindow manualDelivery = new ManualDeliveryWindow(); manualDelivery.ShowDialog(); break; case "ProdStatistics": UserContent = prodStatisticsPage; PageName = "生产统计"; break; case "Exit":// 关闭当前窗口 //Environment.Exit(0); Application.Current.Shutdown(); break; case "Generate": UserContent = generateControl; break; case "ConfigInfo": UserContent = configInfoPage; PageName = "参数配置"; break; case "RecipeManage": UserContent = recipeManagePage; PageName = "配方管理"; break; case "AgvAndTaskPage": UserContent = agvAndTaskMonitorPage; PageName = "AGV监听"; break; // 还原 或者 最大化当前窗口 case "Normal": if (Application.Current.MainWindow.WindowState == WindowState.Normal) { Application.Current.MainWindow.WindowState = WindowState.Maximized; break; } if (Application.Current.MainWindow.WindowState == WindowState.Maximized) { Application.Current.MainWindow.WindowState = WindowState.Normal; break; } break; // 最小化当前窗口 case "Minimized": Application.Current.MainWindow.WindowState = WindowState.Minimized; break; default: break; } } catch (Exception ex) { _logger.LogError("窗体控制逻辑异常", ex); } } /// /// 界面跳转 /// private void ControlOnClick(object obj) { try { string info = obj as string; PageName = "京源环保SCADA"; UserContent = prodMgmtPage; } catch (Exception ex) { _logger.LogError("界面跳转逻辑异常", ex); } } } }