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");
}
}
}