|
- using BPASmartClient.Helper;
- using BPASmartClient.IoT;
- using BPASmartClient.Message;
- using Microsoft.Toolkit.Mvvm.ComponentModel;
- using Microsoft.Toolkit.Mvvm.Input;
- using Microsoft.Win32;
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Media;
- using System.Windows.Threading;
-
- namespace BPASmartClient.ViewModel
- {
- /// <summary>
- /// 日志界面
- /// </summary>
- public class LogViewModel : ObservableObject
- {
- public DispatcherTimer dispatcherTimer;
- public string ClientId = System.Configuration.ConfigurationManager.AppSettings["ClientId"].ToString();
- private ObservableCollection<LogModel> _LogModels;
- public ObservableCollection<LogModel> LogDataGrid
- {
- get
- {
- return _LogModels;
- }
- set
- {
- if (_LogModels == value)
- return;
- _LogModels = value;
- OnPropertyChanged("LogDataGrid");
- }
- }
- private volatile static LogViewModel _Instance;
- public static LogViewModel GetInstance() => _Instance ?? (_Instance = new LogViewModel());
- private LogViewModel()
- {
- logHelper.Fun_InitLog(System.AppDomain.CurrentDomain.BaseDirectory);
- if (LogDataGrid == null) LogDataGrid = new ObservableCollection<LogModel>();
-
- //一般日志
- MessageLog.GetInstance.InfoNotify = new Action<string>((s) =>
- {
- System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() =>
- {
- LogDataGrid.Insert(0, new LogModel { message = s, type = "Info" });
- logHelper.GetLogConfigInstance().WriteLog(LogLevel.INFO, s);
- }));
- });
-
- //设备日志
- MessageLog.GetInstance.DeviceProcessLogNotify = new Action<string, string>((id, s) =>
- {
- System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() =>
- {
- LogDataGrid.Insert(0, new LogModel { message = s, type = "DeviceLog" });
- logHelper.GetLogConfigInstance().WriteLog(LogLevel.DEBUG, s);
- }));
- });
-
- //设备告警日志
- MessageLog.GetInstance.DeviceAlarmLogNotify = new Action<string, string>((id, s) =>
- {
- System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() =>
- {
- LogDataGrid.Insert(0, new LogModel { message = id, type = "DeviceAlarm" });
- logHelper.GetLogConfigInstance().WriteLog(LogLevel.WARN, id);
- }));
- });
-
- //错误日志
- MessageLog.GetInstance.ExInfoNotify = new Action<string>((s) =>
- {
- System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() =>
- {
- LogDataGrid.Insert(0, new LogModel { message = s, type = "Error" });
- logHelper.GetLogConfigInstance().WriteLog(LogLevel.ERROR, s);
- DataVClient.GetInstance().HttpAddLog(new LogTable
- {
- ClientId = ClientId,
- LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- LogType = "严重",
- LogMessage = s,
- LogVla = "错误日志"
- });
- }));
- });
-
- ExcelCommand = new RelayCommand(() =>
- {
- ExcellOrder();
- });
-
- OpenCommand = new RelayCommand(() =>
- {
- string msg = string.Format("已找到日志文件,是否打开! \n 1.如选中不打开,则弹出日志文件夹目录。\n 2.打开,则弹出日志文件夹目录,并打开文件。");
- if (System.Windows.MessageBox.Show(msg, "提示", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
- {
- System.Diagnostics.Process.Start("Explorer", "/select," + logHelper.GetLogConfigInstance().directRollfileAppender.File);
- OpenFile(logHelper.GetLogConfigInstance().directRollfileAppender.File);
- }else
- System.Diagnostics.Process.Start("Explorer", "/select," + logHelper.GetLogConfigInstance().directRollfileAppender.File);
-
- });
-
- dispatcherTimer = new DispatcherTimer();
- dispatcherTimer.Tick += delegate
- {
- System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() =>
- {
- if (LogDataGrid.Count > 100)
- {
- LogDataGrid.RemoveAt(LogDataGrid.Count - 1);
- }
- }));
-
- };
- dispatcherTimer.Interval = TimeSpan.FromSeconds(10);
- dispatcherTimer.Start();
- }
-
- /// <summary>
- /// 导出数据
- /// </summary>
- public void ExcellOrder()
- {
- if (LogDataGrid.Count > 0)
- {
- string text = "时间 类型 日志内容\n";
- LogDataGrid?.ToList().ForEach(temp =>
- {
- text = text + temp.time + " " + temp.type + " " + temp.message + "\n";
- });
- SaveFileDialog openfile = new SaveFileDialog();
- openfile.Filter = "Txt文件(*.txt)|*.txt";
- if (openfile.ShowDialog() == false)
- {
- return;
- }
- string path = openfile.FileName;
- if (!System.IO.File.Exists(path))
- {
- //没有则创建这个文件
- FileStream fs1 = new FileStream(path, FileMode.Create, FileAccess.Write);//创建写入文件
- StreamWriter sw = new StreamWriter(fs1);
- sw.WriteLine(text);//开始写入值
- sw.Close();
- fs1.Close();
- }
- else
- {
- FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write);
- StreamWriter sr = new StreamWriter(fs);
- sr.WriteLine(text);//开始写入值
- sr.Close();
- fs.Close();
- }
- string msg = string.Format("记录导出完成,共导出记录{0}条,是否打开!", LogDataGrid.Count);
- if (System.Windows.MessageBox.Show(msg, "提示", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
- {
- OpenFile(openfile.FileName);
- }
- }
- else
- System.Windows.MessageBox.Show("无数据!");
-
- }
-
- /// <summary>
- /// 打开指定路径下文件,比如:Word、Excel、Dll、图片等都可以(前提是你已经安装打开程序的对应软件)
- /// </summary>
- /// <param name="NewFileName">eg:D:\Test\模版8.doc</param>
- /// <param name="NewFileName">eg:D:\Test\模版8.doc</param>
- private void OpenFile(string NewFileName)
- {
- Process process = new Process();
- ProcessStartInfo processStartInfo = new ProcessStartInfo(NewFileName);
- process.StartInfo = processStartInfo;
- #region 下面这段被注释掉代码(可以用来全屏打开代码)
- //建立新的系统进程
- ////System.Diagnostics.Process process = new System.Diagnostics.Process();
- //设置文件名,此处为图片的真实路径 + 文件名(需要有后缀)
- ////process.StartInfo.FileName = NewFileName;
- //此为关键部分。设置进程运行参数,此时为最大化窗口显示图片。
- ////process.StartInfo.Arguments = "rundll32.exe C://WINDOWS//system32//shimgvw.dll,ImageView_Fullscreen";
- // 此项为是否使用Shell执行程序,因系统默认为true,此项也可不设,但若设置必须为true
- process.StartInfo.UseShellExecute = true;
- #endregion
- try
- {
- process.Start();
- try
- {
- // process.WaitForExit();
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- catch (Exception ex)
- {
- throw ex;
- }
- finally
- {
- try
- {
- if (process != null)
- {
- process.Close();
- process = null;
- }
- }
- catch { }
- }
- }
-
- private bool _RealTimeModel = true;
- public bool RealTimeModel
- {
- get
- {
- return _RealTimeModel;
- }
- set
- {
- if (_RealTimeModel == value)
- return;
- _RealTimeModel = value;
- OnPropertyChanged("RealTimeModel");
- }
- }
-
- private bool _TimedClear = true;
- public bool TimedClear
- {
- get
- {
- return _TimedClear;
- }
- set
- {
- if (_TimedClear == value)
- return;
- _TimedClear = value;
- OnPropertyChanged("TimedClear");
- }
- }
-
- public RelayCommand ExcelCommand { get; set; }
- public RelayCommand OpenCommand { get; set; }
- }
-
- public class LogModel : ObservableObject
- {
- public string time { get; set; }
-
- private string _type;
- public string type
- {
- get
- {
- return _type;
- }
- set
- {
- if (_type == value)
- return;
- _type = value;
- if (_type == "Error") foreground = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#ed0032"));
-
- OnPropertyChanged("type");
- }
- }
- public string message { get; set; }
-
- private Brush _foreground;
- public Brush foreground
- {
- get
- {
- return _foreground;
- }
- set
- {
- if (_foreground == value)
- return;
- _foreground = value;
- OnPropertyChanged("foreground");
- }
- }
- public LogModel()
- {
- foreground = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#21bb2e"));
- time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- }
- }
- }
|