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.

382 lines
12 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using ConsoleApp;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SlnMesnac.Business;
using SlnMesnac.Business.business;
using SlnMesnac.Common;
using SlnMesnac.Repository.service;
using SlnMesnac.WPF.Page;
using SlnMesnac.WPF.Page.Generate;
using System;
using System.ComponentModel;
using System.IO.Ports;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;
namespace SlnMesnac.WPF.ViewModel
{
public class MainWindowViewModel: INotifyPropertyChanged
{
private readonly ILogger<MainWindowViewModel> _logger;
//代码生成
private readonly GenerateControl generateControl = new GenerateControl();
private readonly EmployeeLoginPage _employeeLoginPage = new EmployeeLoginPage();
private readonly ExecutePage _executePage = new ExecutePage();
private IBaseStaffService _baseStaffService;
private System.Timers.Timer timer;
public delegate void UIDCodeDelegate(string code);
public event UIDCodeDelegate UIDCodeDelegateEvent;
private SerialPortBusiness serialPortBusiness;
private string serialPort;
private int baudRate;
private int parity;
private int dataBits;
private int stopBits;
public static int wins = 1;//1为人员登录2为强退确认3为交接换班
#region 委托定义
public delegate void TransferOrderCode(string orderCode);
public static event TransferOrderCode? TransferOrderCodeEvent;
#endregion
#region 参数定义
///// <summary>
///// PLC设备状态
///// </summary>
//private int _PlcStatus = 0;
//public int PlcStatus
//{
// get { return _PlcStatus; }
// set { _PlcStatus = value; RaisePropertyChanged(nameof(PlcStatus)); }
//}
///// <summary>
///// 打卡机状态
///// </summary>
//private int _clockStatus = 0;
//public int ClockStatus
//{
// get { return _clockStatus; }
// set { _clockStatus = value; RaisePropertyChanged(nameof(ClockStatus)); }
//}
/// <summary>
/// 扫码枪状态
/// </summary>
private int _codeGunStatus = 0;
public int CodeGunStatus
{
get { return _codeGunStatus; }
set
{
_codeGunStatus = value;
OnPropertyChanged("CodeGunStatus");
}
}
/// <summary>
/// 订单号框
/// </summary>
private string orderCodeText;
public string OrderCodeText
{
get { return orderCodeText; }
set
{
orderCodeText = value;
OnPropertyChanged("OrderCodeText");
}
}
public System.Windows.Controls.UserControl _content;
public System.Windows.Controls.UserControl UserContent
{
get { return _content; }
set
{
_content = value;
OnPropertyChanged("UserContent");
}
}
#endregion
#region 事件定义
/// <summary>
/// 界面跳转按钮事件
/// </summary>
public RelayCommand<object> ControlOnClickCommand { get; set; }
/// <summary>
/// 打开系统键盘
/// </summary>
public RelayCommand<object> OpenSystemKeyboardCommand { get; set; }
/// <summary>
/// 窗体控制
/// </summary>
public RelayCommand<object> FormControlCommand { get; set; }
/// <summary>
/// 连接
/// </summary>
public ICommand ConnectCommand { get; set; }
/// <summary>
/// 断开
/// </summary>
public ICommand BreakCommand { get; set; }
/// <summary>
/// 确认
/// </summary>
public ICommand ConfirmCommand { get; set; }
#endregion
public MainWindowViewModel()
{
//UserContent = _employeeLoginPage;
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
.SetBasePath(System.AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
IConfigurationRoot configuration = configurationBuilder.Build();
serialPort = configuration.GetSection("AppConfig")["serialPort"];
baudRate = Convert.ToInt32(configuration.GetSection("AppConfig")["baudRate"]);
parity = Convert.ToInt32(configuration.GetSection("AppConfig")["parity"]);
dataBits = Convert.ToInt32(configuration.GetSection("AppConfig")["dataBits"]);
stopBits = Convert.ToInt32(configuration.GetSection("AppConfig")["stopBits"]);
UserContent = _executePage;
_logger = App.ServiceProvider.GetService<ILogger<MainWindowViewModel>>();
serialPortBusiness = App.ServiceProvider.GetService<SerialPortBusiness>();
var info = App.ServiceProvider.GetService<StringChange>();
ControlOnClickCommand = new RelayCommand<object>(obj => ControlOnClick(obj));
OpenSystemKeyboardCommand = new RelayCommand<object>(obj => OpenSystemKeyboard(obj));
FormControlCommand = new RelayCommand<object>(x => FormControl(x));
timer = new System.Timers.Timer(1000); // 1 second interval
timer.Elapsed += Timer_Tick;
timer.Enabled = true;
this.Init();
ConnectCommand = new RelayCommand(OpenSerialPort);
BreakCommand = new RelayCommand(CloseSerialPort);
ConfirmCommand = new RelayCommand(Confirm);
SerialPortBusiness.ReceivedBarcodeInfoEvent += info =>
{
info = OrderCodeText;
};
}
/// <summary>
/// 确认
/// </summary>
/// <exception cref="NotImplementedException"></exception>
private void Confirm()
{
string orderCode = OrderCodeText;
TransferOrderCodeEvent?.Invoke(orderCode);
}
/// <summary>
/// 按钮文字转换事件
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
#region 定义参数
/// <summary>
/// 当前时间
/// </summary>
private string _currentTimeText = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
public string CurrentTimeText
{
get { return _currentTimeText; }
set { _currentTimeText = value; OnPropertyChanged("CurrentTimeText"); }
}
private int _serialPortDeviceStatus = 0;
public int SerialPortDeviceStatus
{
get { return _serialPortDeviceStatus; }
set { _serialPortDeviceStatus = value; OnPropertyChanged("SerialPortDeviceStatus"); }
}
#endregion
/// <summary>
/// 窗体控制
/// </summary>
/// <param name="obj"></param>
private void FormControl(object obj)
{
try
{
string controlType = obj as string;
switch (controlType)
{
// 关闭当前窗口
case "Exit":
//Environment.Exit(0);
Application.Current.Shutdown();
break;
case "Generate":
UserContent = generateControl;
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);
}
}
/// <summary>
/// 初始串口
/// </summary>
private void Init()
{
this.serialPortBusiness.RefreshSerialPortDeviceStatusEvent += isFlag =>
{
App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
SerialPortDeviceStatus = isFlag;
}));
};
}
/// <summary>
/// 打开串口
/// </summary>
private void OpenSerialPort()
{
try
{
this.GetParity(out int parity);
this.serialPortBusiness.OpenSerialPort(serialPort, baudRate, parity, dataBits, stopBits);
}
catch (Exception ex)
{
_logger.LogError($"打开串口通讯异常:{ex.Message}");
}
}
/// <summary>
/// 关闭串口
/// </summary>
private void CloseSerialPort()
{
try
{
this.serialPortBusiness.CloseSerialPort();
}
catch (Exception ex)
{
_logger.LogError($"关闭串口通讯异常:{ex.Message}");
}
}
/// <summary>
/// 转换校验位
/// </summary>
/// <param name="parity"></param>
private void GetParity(out int parity)
{
switch (serialPort)
{
case "None":
parity = 0;
break;
case "Odd":
parity = 1;
break;
case "Even":
parity = 2;
break;
case "Mark":
parity = 3;
break;
case "Space":
parity = 4;
break;
default:
parity = 0;
break;
}
}
/// <summary>
/// 打开系统键盘
/// </summary>
/// <param name="obj"></param>
private void OpenSystemKeyboard(object obj)
{
System.Diagnostics.Process.Start("osk.exe");
}
/// <summary>
/// 界面跳转
/// </summary>
private void ControlOnClick(object obj)
{
try
{
string info = obj as string;
//UserContent = inStoreInfoControl;
switch (info)
{
case "Execute":
UserContent = _executePage;
break;
case "Employee":
UserContent = _employeeLoginPage;
break;
default:
UserContent = _executePage;
break;
}
}
catch (Exception ex)
{
_logger.LogError("界面跳转逻辑异常", ex);
}
}
private void Timer_Tick(object sender, ElapsedEventArgs e)
{
CurrentTimeText = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}