using Aitex.Core.RT.Event; using Aitex.Core.RT.Log; using Aitex.Core.WCF; using MECF.Framework.Common.DataCenter; using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Media.Imaging; using Venus_Core; using Venus_MainPages.Unity; using Venus_MainPages.Views; namespace Venus_MainPages.ViewModels { public class EventViewModel : BindableBase { #region 私有字段 private bool m_IsAuto; private int m_Total; private int m_PageCount; private int m_CurrentPage = 1; private int m_onePageCounts = 30; private bool m_FirstFlag = true; #endregion #region 属性 public bool SearchAlarmEvent { get; set; } public bool SearchWarningEvent { get; set; } public bool SearchInfoEvent { get; set; } public bool SearchOpeLog { get; set; } public bool SearchPMA { get; set; } public bool SearchPMB { get; set; } public bool SearchPMC { get; set; } public bool SearchPMD { get; set; } public bool SearchTM { get; set; } public bool SearchLLA { get; set; } public bool SearchLLB { get; set; } public bool SearchSystem { get; set; } public bool SearchEFEM { get; set; } public bool SearchVCEA { get; set; } public bool SearchVCEB { get; set; } public bool SearchALL { get; set; } public bool KeplerType { get; set; } public string SearchKeyWords { get; set; } public bool IsAuto { get { return m_IsAuto; } set { if (value == true) { GlobalEvents.Instance.EventItemRaiseChangedEvent += Instance_OnEvent; } else { GlobalEvents.Instance.EventItemRaiseChangedEvent -= Instance_OnEvent; } SetProperty(ref m_IsAuto, value); } } public int Total { get { return m_Total; } set { SetProperty(ref m_Total, value); } } public int PageCount { get { return m_PageCount; } set { SetProperty(ref m_PageCount, value); } } public int CurrentPage { get { return m_CurrentPage; } set { SetProperty(ref m_CurrentPage, value); } } public DateTime SearchBeginTime { get; set; } public DateTime SearchEndTime { get; set; } public ObservableCollection EventList { get; set; } public string SelectedEvent { get; set; } public ObservableCollection SearchedResult { get; set; } = new ObservableCollection(); public Func> QueryDBEventFunc { get; set; } public Func> QueryEventList { get; set; } #endregion #region 命令 private DelegateCommand _SearchCommand; public DelegateCommand SearchCommand => _SearchCommand ?? (_SearchCommand = new DelegateCommand(Search)); private DelegateCommand _ExportCommand; public DelegateCommand ExportCommand => _ExportCommand ?? (_ExportCommand = new DelegateCommand(Export)); private DelegateCommand _LoadCommand; public DelegateCommand LoadCommand => _LoadCommand ?? (_LoadCommand = new DelegateCommand(OnLoad)); #endregion public EventViewModel() { this.QueryDBEventFunc = (sql) => QueryDataClient.Instance.Service.QueryDBEvent(sql); //this.QueryEventList = () => //{ // List result = new List(); // foreach (var eventName in Enum.GetNames(typeof(EventEnum))) // result.Add(eventName); // return result; //}; var now = DateTime.Today; SearchBeginTime = now; SearchEndTime = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59, 999); //SearchKeyWords = string.Empty; SearchAlarmEvent = true; SearchWarningEvent = true; SearchInfoEvent = true; SearchOpeLog = false; SearchPMA = true; SearchPMB = true; SearchPMC = true; SearchPMD = true; SearchTM = true; SearchLLA = true; SearchLLB = true; SearchVCEA = true; SearchVCEB = true; SearchSystem = true; SearchEFEM = true; object obj = QueryDataClient.Instance.Service.GetData("System.ConfigType"); var configType = (ConfigType)Convert.ToInt32(obj); if (configType == ConfigType.Kepler2200 || configType == ConfigType.Kepler2300) { KeplerType = true; } } private void Instance_OnEvent(EventItem eventItem) { switch (eventItem.Type) { case EventType.EventUI_Notify: Application.Current.Dispatcher.Invoke(delegate { SearchedResult.Insert(0, new Aitex.Core.UI.View.Common.SystemLogItem() { ID = eventItem.Id.ToString(), LogType = eventItem.Level.ToString(), Time = eventItem.OccuringTime.ToString(), TargetChamber = eventItem.Source, Detail = eventItem.Description, Icon = new BitmapImage(new Uri(string.Format("pack://application:,,,/MECF.Framework.Common;component/Resources/SystemLog/{0}.png", eventItem.Level.ToString()), UriKind.Absolute)) } ); }); break; case EventType.Dialog_Nofity: break; case EventType.KickOut_Notify: break; case EventType.Sound_Notify: break; case EventType.UIMessage_Notify: break; } } #region 方法 private void OnLoad(Object eventView) { if (m_FirstFlag) { m_FirstFlag = false; this.view = (EventView)eventView; this.view.wfTimeFrom.Value = this.SearchBeginTime; this.view.wfTimeTo.Value = this.SearchEndTime; this.view.pageControl.CurrentPageChanged += PageControl_CurrentPageChanged; } } private void PageControl_CurrentPageChanged(int currentPage) { PageChanged(currentPage); } /// /// 导出 /// public void Export() { try { Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); dlg.DefaultExt = ".xls"; // Default file extension dlg.Filter = "Excel数据表格文件(*.xls)|*.xls"; // Filter files by extension Nullable result = dlg.ShowDialog();// Show open file dialog box if (result == true) // Process open file dialog box results { System.Data.DataSet ds = new System.Data.DataSet(); ds.Tables.Add(new System.Data.DataTable("系统运行日志")); ds.Tables[0].Columns.Add("类型"); ds.Tables[0].Columns.Add("时间"); ds.Tables[0].Columns.Add("模块"); //ds.Tables[0].Columns.Add("发起源"); ds.Tables[0].Columns.Add("内容描述"); foreach (var item in SearchedResult) { var row = ds.Tables[0].NewRow(); row[0] = item.LogType; row[1] = item.Time; row[2] = item.TargetChamber; //row[2] = item.Initiator; row[3] = item.Detail; ds.Tables[0].Rows.Add(row); } ds.WriteXml(dlg.FileName); } } catch (Exception ex) { //LOG.Write(ex); LOG.WriteExeption(ex); MessageBox.Show("导出系统日志发生错误", "导出失败", MessageBoxButton.OK, MessageBoxImage.Warning); } } public void Search() { Task.Factory.StartNew(() => { this.view.Dispatcher.Invoke(() => { try { this.SearchBeginTime = this.view.wfTimeFrom.Value; this.SearchEndTime = this.view.wfTimeTo.Value; string test = $"SELECT COUNT(*) FROM \"event_data\" where \"occur_time\" >='{SearchBeginTime.ToString("yyyy/MM/dd HH:mm:ss")}' and \"occur_time\" <='{SearchEndTime.ToString("yyyy/MM/dd HH:mm:ss")}'"; test += SearchSqlString(); Total = QueryDataClient.Instance.Service.GetDBEventAllCount(test); PageCount = (Total / m_onePageCounts) + 1; SearchedResult = new ObservableCollection(); string sqlEvent = ""; string sql = ""; sqlEvent = string.Format("SELECT \"event_id\", \"event_enum\", \"type\", \"occur_time\", \"level\",\"source\" , \"description\" FROM \"event_data\" where \"occur_time\" >='{0}' and \"occur_time\" <='{1}' ", SearchBeginTime.ToString("yyyy/MM/dd HH:mm:ss"), SearchEndTime.ToString("yyyy/MM/dd HH:mm:ss")); sqlEvent += SearchSqlString(); sqlEvent += $" order by \"occur_time\" ASC"; if (PageCount > 5) { sqlEvent += $" limit {m_onePageCounts} offset {(CurrentPage - 1) * m_onePageCounts};"; } sql = sqlEvent; if (!string.IsNullOrEmpty(sql)) { //sql += $" order by \"occur_time\" DESC limit {m_onePageCounts};"; List lstEvent = QueryDBEventFunc(sql); if (lstEvent == null) return; Application.Current.Dispatcher.BeginInvoke(new Action(() => { string logTypeStr; foreach (EventItem ev in lstEvent) { switch (ev.Level) { case EventLevel.Information: logTypeStr = "Info"; break; case EventLevel.Warning: logTypeStr = "Warning"; break; case EventLevel.Alarm: logTypeStr = "Alarm"; break; default: logTypeStr = "Undefine"; break; } SearchedResult.Add(new Aitex.Core.UI.View.Common.SystemLogItem() { ID = ev.Id.ToString(), Time = ((DateTime)ev.OccuringTime).ToString("yyyy/MM/dd HH:mm:ss.fff"), LogType = logTypeStr, Detail = ev.Description, TargetChamber = ev.Source, Initiator = "", Icon = new BitmapImage(new Uri(string.Format("pack://application:,,,/MECF.Framework.Common;component/Resources/SystemLog/{0}.png", ev.Level.ToString()), UriKind.Absolute)) }); ; } RaisePropertyChanged("SearchedResult"); })); } else { Application.Current.Dispatcher.BeginInvoke(new Action(() => { SearchedResult = new ObservableCollection(); RaisePropertyChanged("SearchedResult"); })); } } catch (Exception ex) { //LOG.Write(ex); LOG.WriteExeption(ex); } }); }); } public void PageChanged(int CurrentPage) { Task.Factory.StartNew(() => { this.view.Dispatcher.Invoke(() => { try { SearchedResult = new ObservableCollection(); this.SearchBeginTime = this.view.wfTimeFrom.Value; this.SearchEndTime = this.view.wfTimeTo.Value; string sqlEvent = ""; string sql = ""; sqlEvent = string.Format("SELECT \"event_id\", \"event_enum\", \"type\", \"occur_time\", \"level\",\"source\" , \"description\" FROM \"event_data\" where \"occur_time\" >='{0}' and \"occur_time\" <='{1}' ", SearchBeginTime.ToString("yyyy/MM/dd HH:mm:ss"), SearchEndTime.ToString("yyyy/MM/dd HH:mm:ss")); sqlEvent += SearchSqlString(); sql = sqlEvent; sql += $" order by \"occur_time\" ASC limit {m_onePageCounts} offset {(CurrentPage - 1) * m_onePageCounts};"; if (!string.IsNullOrEmpty(sql) && QueryDBEventFunc != null) { List lstEvent = QueryDBEventFunc(sql); if (lstEvent == null) return; Application.Current.Dispatcher.BeginInvoke(new Action(() => { string logTypeStr; foreach (EventItem ev in lstEvent) { switch (ev.Level) { case EventLevel.Information: logTypeStr = "Info"; break; case EventLevel.Warning: logTypeStr = "Warning"; break; case EventLevel.Alarm: logTypeStr = "Alarm"; break; default: logTypeStr = "Undefine"; break; } SearchedResult.Add(new Aitex.Core.UI.View.Common.SystemLogItem() { ID = ev.Id.ToString(), Time = ((DateTime)ev.OccuringTime).ToString("yyyy/MM/dd HH:mm:ss.fff"), LogType = logTypeStr, Detail = ev.Description, TargetChamber = ev.Source, Initiator = "", Icon = new BitmapImage(new Uri(string.Format("pack://application:,,,/MECF.Framework.Common;component/Resources/SystemLog/{0}.png", ev.Level.ToString()), UriKind.Absolute)) }); ; } RaisePropertyChanged("SearchedResult"); })); } else { Application.Current.Dispatcher.BeginInvoke(new Action(() => { SearchedResult = new ObservableCollection(); RaisePropertyChanged("SearchedResult"); })); } } catch (Exception ex) { LOG.WriteExeption(ex); } }); }); } private EventView view; public string SearchSqlString() { this.SearchBeginTime = this.view.wfTimeFrom.Value; this.SearchEndTime = this.view.wfTimeTo.Value; string sqlEvent = ""; string sql = ""; //sqlEvent = string.Format("SELECT \"event_id\", \"event_enum\", \"type\", \"occur_time\", \"level\",\"source\" , \"description\" FROM \"event_data\" where \"occur_time\" >='{0}' and \"occur_time\" <='{1}' ", SearchBeginTime.ToString("yyyyMMdd HHmmss"), SearchEndTime.ToString("yyyyMMdd HHmmss")); sqlEvent += " and (FALSE "; if (SearchAlarmEvent) sqlEvent += " OR \"level\"='Alarm' "; if (SearchWarningEvent) sqlEvent += " OR \"level\"='Warning' "; if (SearchInfoEvent) sqlEvent += " OR \"level\"='Information' "; sqlEvent += " ) "; if (this.view.allModuleCheckBox.IsChecked!=true) { sqlEvent += " and (FALSE "; if (SearchPMA) sqlEvent += " OR \"source\"='PMA' "; if (SearchPMB) sqlEvent += " OR \"source\"='PMB' "; if (SearchPMC) sqlEvent += " OR \"source\"='PMC' "; if (SearchPMD) sqlEvent += " OR \"source\"='PMD' "; if (SearchLLA) sqlEvent += " OR \"source\"='LLA' "; if (SearchLLB) sqlEvent += " OR \"source\"='LLB' "; if (SearchTM) sqlEvent += " OR \"source\"='TM' "; if (SearchTM) sqlEvent += " OR \"source\"='TMRobot' "; if (SearchEFEM) sqlEvent += " OR \"source\"='EfemRobot' "; if (SearchEFEM) sqlEvent += " OR \"source\"='EFEM' "; if (SearchVCEA) sqlEvent += " OR \"source\"='VCEA' "; if (SearchVCEB) sqlEvent += " OR \"source\"='VCEB' "; if (SearchSystem) sqlEvent += " OR \"source\"='System' "; sqlEvent += " ) "; } sql = sqlEvent; return sql; } #endregion } }