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.Common; using SlnMesnac.Config; using SlnMesnac.Plc; using SlnMesnac.TouchSocket; using SlnMesnac.WPF.Page; using SlnMesnac.WPF.Page.Generate; using System; using System.Collections.Generic; using System.Diagnostics; 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 LocationPage locationPage = new LocationPage(); 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 * 60); 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 CheckVersion() { try { string version = HttpHelper.SendGetMessage("172.16.12.100", 5001, "wcs/RecieveRcs/version"); var vs = new Version(version); // SystemData.VerSion var lovs = new Version(debugConfig.Version); if (vs > lovs) { var result = MessageBox.Show("有新版本是否更新?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Information); if (result == MessageBoxResult.Yes) { Process.Start("AutoUpdate.exe", new List { version, debugConfig.ProcessName, // SystemData.ProcessName, $"http://172.16.12.100:5001/wcs/RecieveRcs?fileName={debugConfig.ProcessName}.zip" }); debugConfig.Version = version; Application.Current.Shutdown(); Process.GetCurrentProcess().Kill(); } } } catch { } } 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 && rfidEquip.IsConnected) { rfidEquip.RefreshStatus(); Out2FRfidStatus = 1; } else { Out2FRfidStatus = 2; bool result = rfidEquip.Connect(rfidEquip.ip, rfidEquip.port); rfidEquip.IsConnected = result; } #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":// 关闭当前窗口 var result = MessageBox.Show("确定要关闭程序吗?", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No, MessageBoxOptions.None); if (result== MessageBoxResult.Yes) { _logger.LogWarning("用户手动关闭程序"); Application.Current.Shutdown(); } break; case "Generate": UserContent = generateControl; break; case "ConfigInfo": string password = Microsoft.VisualBasic.Interaction.InputBox("请输入密码:", "密码验证", "", -1, -1); if (password == debugConfig.ConfigInfoPassWprd) // 检查密码是否正确 { UserContent = configInfoPage; PageName = "参数配置"; } else if(!string.IsNullOrEmpty(password)) { MessageBox.Show("密码错误,请重试!", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } //UserContent = configInfoPage; //PageName = "参数配置"; break; case "RecipeManage": UserContent = recipeManagePage; PageName = "配方管理"; break; case "AgvAndTaskPage": UserContent = agvAndTaskMonitorPage; PageName = "AGV监听"; break; case "LocationPage": UserContent = locationPage; PageName = "库位信息"; 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); } } } }