using BPASmartClient.Helper; using BPASmartClient.IoT; using BPASmartClient.Message; using BPASmartClient.Model; 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.ComponentModel; 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 { /// /// 日志界面 /// public class LogViewModel : ObservableObject { #region 变量 //定时上报文件到阿里云 public DispatcherTimer UpDataFileTimer; //定时清除界面日志 public DispatcherTimer dispatcherTimer; public string ClientId = System.Configuration.ConfigurationManager.AppSettings["ClientId"].ToString(); public ObservableCollection LogDataGridData { get; set; } private ObservableCollection _LogModels;public ObservableCollection LogDataGrid { get { return _LogModels; } set { if (_LogModels == value) return; _LogModels = value; OnPropertyChanged("LogDataGrid"); } } 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"); } } private string _SelectedText = ""; public string SelectedText { get { return _SelectedText; } set { if (_SelectedText == value) return; _SelectedText = value; OnPropertyChanged("SelectedText"); } } public ObservableCollection SelectBookExs { set; get; } private ObservableCollection _books; public ObservableCollection BookExs { get { if (_books == null) { _books = new ObservableCollection(); _books.CollectionChanged += (sender, e) => { if (e.OldItems != null) { foreach (BookEx bookEx in e.OldItems) { bookEx.PropertyChanged -= ItemPropertyChanged; } } if (e.NewItems != null) { foreach (BookEx bookEx in e.NewItems) { bookEx.PropertyChanged += ItemPropertyChanged; } } }; } return _books; } } #endregion #region 单一 private volatile static LogViewModel _Instance; public static LogViewModel GetInstance() => _Instance ?? (_Instance = new LogViewModel()); private LogViewModel() { Init(); } #endregion #region 函数 /// /// 初始化 /// public void Init() { logHelper.Fun_InitLog(System.AppDomain.CurrentDomain.BaseDirectory); if (LogDataGrid == null) LogDataGrid = new ObservableCollection(); if (LogDataGridData == null) LogDataGridData = new ObservableCollection(); BookExs.Add(new BookEx(new Book() { Name = "一般日志", Tag = "Info" }) { IsChecked = true }); BookExs.Add(new BookEx(new Book() { Name = "设备日志", Tag = "DeviceLog" }) { IsChecked = true }); BookExs.Add(new BookEx(new Book() { Name = "错误日志", Tag = "Error" }) { IsChecked = true }); BookExs.Add(new BookEx(new Book() { Name = "告警日志", Tag = "DeviceAlarm" }) { IsChecked = true }); SelectBookExs = new ObservableCollection(); ItemPropertyChanged(new BookEx(new Book()) { IsChecked = true }, new PropertyChangedEventArgs("IsChecked")); //一般日志 MessageLog.GetInstance.InfoNotify = new Action((s) => { System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => { LogModel logModel = new LogModel { message = s, type = "Info" }; LogDataGridData.Insert(0, logModel); AddLog(logModel); logHelper.GetLogConfigInstance().WriteLog(LogLevel.INFO, s); })); }); //设备日志 MessageLog.GetInstance.DeviceProcessLogNotify = new Action((id, s) => { System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => { LogModel logModel = new LogModel { message = s, type = "DeviceLog" }; LogDataGridData.Insert(0, logModel); AddLog(logModel); logHelper.GetLogConfigInstance().WriteLog(LogLevel.DEBUG, s); })); }); //设备告警日志 MessageLog.GetInstance.DeviceAlarmLogNotify = new Action((id, s) => { System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => { LogModel logModel = new LogModel { message = id, type = "DeviceAlarm" }; LogDataGridData.Insert(0, logModel); AddLog(logModel); logHelper.GetLogConfigInstance().WriteLog(LogLevel.WARN, id); })); }); //错误日志 MessageLog.GetInstance.ExInfoNotify = new Action((s) => { System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => { LogModel logModel = new LogModel { message = s, type = "Error" }; LogDataGridData.Insert(0, logModel); AddLog(logModel); 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); logHelper.GetLogConfigInstance().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 (LogDataGridData.Count > 200) { LogModel logModel= LogDataGridData.Last(); DeleteLog(logModel); LogDataGridData.Remove(logModel); } })); }; dispatcherTimer.Interval = TimeSpan.FromSeconds(10); dispatcherTimer.Start(); UpDataFileTimer = new DispatcherTimer(); UpDataFileTimer.Tick += delegate { DataVClient.GetInstance().UpDataFile(); }; UpDataFileTimer.Interval = TimeSpan.FromHours(0.5); UpDataFileTimer.Start(); } /// /// 增加日志 /// public void AddLog(LogModel logModel) { BookEx book= SelectBookExs?.ToList().Find(par => par.IsChecked && par.BookN.Tag == logModel.type); if (book != null) { LogDataGrid.Insert(0, logModel); } } /// /// 刷新日志 /// /// public void RefreshLog() { LogDataGrid.Clear(); LogDataGridData?.ToList().ForEach(b => { BookEx book = SelectBookExs?.ToList().Find(par => par.IsChecked && par.BookN.Tag == b.type); if (book != null) { LogDataGrid.Add(b); } }); } /// /// 删除日志 /// public void DeleteLog(LogModel logModel) { LogModel log= LogDataGrid?.ToList().Find(par => par == logModel); if(log!=null) LogDataGrid.Remove(log); } /// /// 导出数据 /// 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) { logHelper.GetLogConfigInstance().OpenFile(openfile.FileName); } } else System.Windows.MessageBox.Show("无数据!"); } /// /// 选中改变 /// /// /// private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "IsChecked") { BookEx bookEx = sender as BookEx; if (bookEx != null) { IEnumerable bookExs = BookExs.Where(b => b.IsChecked == true); StringBuilder builder = new StringBuilder(); SelectBookExs.Clear(); foreach (BookEx item in bookExs) { builder.Append(item.BookN.Name.Replace("日志","") + ","); SelectBookExs.Add((BookEx)item); } SelectedText = builder == null ? string.Empty : builder.ToString(); RefreshLog(); } } } #endregion #region Command public RelayCommand ExcelCommand { get; set; } public RelayCommand OpenCommand { get; set; } #endregion } 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" || _type == "Error".ToUpper() || _type == "DeviceAlarm".ToUpper() || _type == "DeviceAlarm") foreground = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#ed0032")); OnPropertyChanged("type"); OnPropertyChanged("foreground"); } } 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"); } } }