You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

253 lines
7.9 KiB
C#

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SlnMesnac.Config;
using SlnMesnac.Model.domain;
using SlnMesnac.Plc;
using SlnMesnac.Serilog;
using SlnMesnac.WPF.Page;
using SlnMesnac.WPF.Page.Generate;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
namespace SlnMesnac.WPF.ViewModel
{
public class MainWindowViewModel : ViewModelBase
{
public readonly SerilogHelper _logger;
public List<PlcAbsractFactory> plcList;
// private readonly GenerateControl generateControl = new GenerateControl();
private readonly IndexControl indexControl = new IndexControl();
private readonly DeviceMonitorControl deviceMonitorPage = new DeviceMonitorControl();
private readonly TaskHistoryControl taskHistoryControl = new TaskHistoryControl();
private readonly TonerBoxingControl tonerBoxingControl = new TonerBoxingControl();
private readonly LocationAndStockControl locationAndStockControl = new LocationAndStockControl();
private DispatcherTimer _timer;
#region 参数定义
/// <summary>
/// 当前时间
/// </summary>
private string _CurrentTime = "";
public string CurrentTime
{
get { return _CurrentTime; }
set { _CurrentTime = value; RaisePropertyChanged(nameof(CurrentTime)); }
}
/// <summary>
/// PLC设备状态
/// </summary>
private int _PlcStatus = 0;
public int PlcStatus
{
get { return _PlcStatus; }
set { _PlcStatus = value; RaisePropertyChanged(nameof(PlcStatus)); }
}
/// <summary>
/// 箱壳扫码器状态
/// </summary>
private int _ShellScannerStatus = 0;
public int ShellScannerStatus
{
get { return _ShellScannerStatus; }
set { _ShellScannerStatus = value; RaisePropertyChanged(nameof(ShellScannerStatus)); }
}
/// <summary>
/// 内胆扫码器状态
/// </summary>
private int _BoldScannerStatus = 0;
public int BoldScannerStatus
{
get { return _BoldScannerStatus; }
set { _BoldScannerStatus = value; RaisePropertyChanged(nameof(BoldScannerStatus)); }
}
public System.Windows.Controls.UserControl _content;
public System.Windows.Controls.UserControl UserContent
{
get { return _content; }
set
{
_content = value;
RaisePropertyChanged(nameof(UserContent));
}
}
#endregion 参数定义
#region 事件定义
/// <summary>
/// 打开系统键盘
/// </summary>
public RelayCommand OpenSystemKeyboardCommand { get; set; }
/// <summary>
/// 窗体控制
/// </summary>
public RelayCommand<object> FormControlCommand { get; set; }
#endregion 事件定义
public MainWindowViewModel()
{
_logger = App.ServiceProvider.GetService<SerilogHelper>();
plcList = App.ServiceProvider.GetRequiredService<List<PlcAbsractFactory>>();
FormControlCommand = new RelayCommand<object>(x => FormControl(x));
UserContent = indexControl;
Init();
}
private void Init()
{
StartCheckStatus();
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.Tick += Timer_Tick;
_timer.Start();
}
#region
/// <summary>
/// 检查设备状态自动重连
/// </summary>
private void StartCheckStatus()
{
Task.Run(async () =>
{
while (true)
{
try
{
#region PLC状态
foreach (var plc in plcList)
{
PlcConfig? plcConfig = App.ServiceProvider.GetService<AppConfig>().plcConfig.FirstOrDefault(x => x.plcKey == plc.ConfigKey);
if (plc != null && plc.IsConnected)
{
plc.IsConnected = plc.readHeartByAddress("M100"); //DB100.DBX0.0
if (!plc.IsConnected)
{
plc.IsConnected = await plc.ConnectAsync(plcConfig.plcIp, plcConfig.plcPort);
}
}
else
{
if (plcConfig != null)
{
bool result = await plc.ConnectAsync(plcConfig.plcIp, plcConfig.plcPort);
plc.IsConnected = result;
}
}
PlcStatus = plc.IsConnected ? 1 : 2;
}
#endregion PLC状态
}
catch (Exception ex)
{
_logger.Error($"监听设备状态异常:{ex.Message}");
}
await Task.Delay(1000 * 10);
}
});
}
#endregion
/// <summary>
/// 更新系统时间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Timer_Tick(object sender, EventArgs e)
{
CurrentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
/// <summary>
/// 窗体控制
/// </summary>
/// <param name="obj"></param>
private void FormControl(object obj)
{
try
{
string controlType = obj as string;
switch (controlType)
{
case "Index":
UserContent = indexControl;
break;
case "DeviceMonitor":
UserContent = deviceMonitorPage;
break;
case "LocationAndStock":
UserContent = locationAndStockControl;
break;
case "TaskHistory":
UserContent = taskHistoryControl;
break;
case "TonerBoxing":
UserContent = tonerBoxingControl;
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;
case "Exit":
Application.Current.Shutdown();
break;
default:
break;
}
}
catch (Exception ex)
{
_logger.Error("窗体控制逻辑异常", ex);
}
}
}
}