using Arction.Wpf.SignalProcessing; using LiveCharts.Defaults; using log4net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.SS.Formula.Functions; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Configuration; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.IO; using System.Linq; using System.Media; using System.Reflection; using System.Runtime.Remoting.Contexts; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Documents; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Media; using System.Windows.Threading; using Txgy.EWS.Client.Common; using Txgy.EWS.Client.Common.MessageEvents; using Txgy.EWS.Client.Entity; using Txgy.EWS.Client.IBLL; using Txgy.EWS.Client.ILog; using Txgy.EWS.Client.Models; using Txgy.EWS.Client.PageModule.Models; using Txgy.EWS.Client.PageModule.Services; using Txgy.Microseismic.BaseLib.Entitys; using Txgy.Microseismic.BaseLib.Models; using Unity; using static Txgy.EWS.Client.Common.GlobalConfig; namespace Txgy.EWS.Client.PageModule.ViewModels { public class EventListViewModel : BindableBase { private readonly IEventAggregator ea; private readonly ISearchMsEventBLL searchMsEventBLL; private readonly ILogHelper _logHelper; //private readonly IRemoteDownloadDataBLL remoteDownloadDataBLL; Dispatcher _dispatcher; IFreeSql fsqlTencent = FreeSqlTencent.tencentRemoteMySQL; IFreeSql fsqlSqLite = FreeSqlLocalSqLite.freeLocalSqLite; private bool isCanRun = true; public bool IsCanRun { get { return isCanRun; } set { SetProperty(ref isCanRun, value); } } /// /// 刷新间隔(s) /// private int refreshInterval = 3; public int RefreshInterval { get { return refreshInterval; } set { SetProperty(ref refreshInterval, value); } } private string runSpan = "0"; public string RunSpan { get { return runSpan; } set { SetProperty(ref runSpan, value); } } private double alarmThreshold = 1; /// /// 报警阈值:J /// public double AlarmThreshold { get { return alarmThreshold; } set { SetProperty(ref alarmThreshold, value); } } public DateTime SystemRunTime { get; set; } /// /// 报警等级列表 /// public List ListAlarmLevel; public List ListAlramMusic { get; set; } SoundPlayer alarmPlayer = new SoundPlayer(); private bool canPlayAlarmSound = true; public bool CanPlayAlarmSound { get { return canPlayAlarmSound; } set { SetProperty(ref canPlayAlarmSound, value); } } private GridItemEventResult selectGirdItem; public GridItemEventResult SelectGirdItem { get { return selectGirdItem; } set { SetProperty(ref selectGirdItem, value); if (selectGirdItem != null) { this.ea.GetEvent().Publish(selectGirdItem.EventTime); } } } private string curAlarmMusic; public string CurAlarmMusic { get { return curAlarmMusic; } set { SetProperty(ref curAlarmMusic, value); alarmPlayer.SoundLocation = AppDomain.CurrentDomain.BaseDirectory + "audio\\" + curAlarmMusic; alarmPlayer.LoadAsync(); } } private int _runEventCnt = 0; public int RunEventCnt { get { return _runEventCnt; } set { SetProperty(ref _runEventCnt, value); } } private int _resultCount = 0; /// /// 查询结果数量 /// public int ResultCount { get { return _resultCount; } set { SetProperty(ref _resultCount, value); } } private float _searchMaxML = 0f; public float SearchMaxML { get { return _searchMaxML; } set { SetProperty(ref _searchMaxML, value); } } private float _searchMinML = -2.0f; public float SearchMinML { get { return _searchMinML; } set { SetProperty(ref _searchMinML, value); } } private int pageIndex = 1; public int PageIndex { get { return pageIndex; } set { SetProperty(ref pageIndex, value); //PageIndexChanged(); } } private int maxPageCount = 5; public int MaxPageCount { get { return maxPageCount; } set { SetProperty(ref maxPageCount, value); } } private int perPageCount = 15; public int PerPageCount { get { return perPageCount; } set { SetProperty(ref perPageCount, value); } } private DateTime _startTime; /// /// 起始时间 /// public DateTime StartTime { get { return _startTime; } set { SetProperty(ref _startTime, value); } } private DateTime _endTime; public DateTime EndTime { get { return _endTime; } set { SetProperty(ref _endTime, value); } } private ObservableCollection _searchEvents = new ObservableCollection(); public ObservableCollection SearchEvents { get { return _searchEvents; } set { SetProperty(ref _searchEvents, value); } } private AlarmSetting alarmSetting; public AlarmSetting AlarmSettingConfig { get { return alarmSetting; } set { SetProperty(ref alarmSetting, value); } } private AlarmLevelModel curAlarmLevel; public AlarmLevelModel CurAlarmLevel { get { return curAlarmLevel; } set { SetProperty(ref curAlarmLevel, value); } } public ICommand ProcessAlarmCommand { get => new DelegateCommand((i) => { }); } public ICommand SearchCommand { get => new Prism.Commands.DelegateCommand(() => { //2023-02-04,已重写 //var mmes = fsqlTencent.Select() // .Where(pp => DateTime.Parse(pp.EventTime).Ticks > StartTime.Ticks && // DateTime.Parse(pp.EventTime).Ticks <= EndTime.Ticks) // .ToList() // .OrderByDescending(po => po.RTEventID).ToList(); var mme = searchMsEventBLL.GetEvents(StartTime, EndTime, SearchMinML, SearchMaxML); if (mme?.Count > 0) { ResultCount = mme.Count; GlobalData.GridEvents.Clear(); if (!GlobalData.AppendEvent) { GlobalData.SearchEvents.Clear(); } mme.ForEach(me => { GridItemEventResult ger = new GridItemEventResult(me); ger.SetEnergy(); GlobalData.GridEvents.Add(ger); LocalRealtimeResultEntity lrre = new LocalRealtimeResultEntity(); lrre.RTEventID = me.EventID; lrre.WorkAreaID = me.WorkAreaID; lrre.EventTime = me.EventTimeStr; lrre.OriginTime = me.EventTimeStr; lrre.X = me.Y; lrre.Y = me.X; lrre.Z = me.Z; lrre.ML = Math.Round(me.ML, 2); lrre.RMS = Math.Round(me.RMS, 3); lrre.LocSta = me.LocSta; lrre.MLSta = me.MLSta; lrre.SetEnergy(); var re = fsqlSqLite.Select().Where(rel => rel.RTEventID == lrre.RTEventID).ToOne(); if (re == null) { fsqlSqLite.Insert(lrre).ExecuteIdentityAsync(); } RemoteRealtimeResultEntity rrre = new RemoteRealtimeResultEntity(lrre); if (!GlobalData.SearchEvents.Contains(rrre)) { GlobalData.SearchEvents.Add(rrre); } }); } //查询事件更新 this.ea.GetEvent().Publish("查询事件更新"); //PageIndexChanged(); }); } public ICommand ChangeMusicCommand { get => new Prism.Commands.DelegateCommand(() => { LogObject.Log(MethodBase.GetCurrentMethod().Name).Info("===========End==============>>>"); //AlarmRecordEntity arent = new AlarmRecordEntity(); //arent.EventId = 2; //arent.AlarmLevel = 1; //arent.Energy = 10; //arent.AlarmTime = "1"; //arent.ProcessTime = "1"; //long id = fsqlSqLite.Insert(arent).ExecuteIdentity(); //var t1 = fsqlSqLite.Insert(arent).ExecuteAffrows(); //Stopwatch watch = new Stopwatch(); //watch.Start(); ////MmEventEntity mmEvent= searchMsEventBLL.GetLastEvent(); ////var mme = fsqlTencent.Select() ////.Where(re => DateTime.Parse(re.EventTime).Ticks <= dateTime.Ticks) ////.OrderByDescending(re => re.RTEventID).First(); //var mms = searchMsEventBLL.GetLastNewEvents(10); //watch.Stop(); //TimeSpan timespan = watch.Elapsed; //Console.WriteLine("BLL,数量:" + mms.Count + " ++++++++++++++++时长:" + timespan.TotalMilliseconds); }); } public ICommand StartMonitoringCommand { //2023-02-21 get => new Prism.Commands.DelegateCommand(StartMonitorning); #region 2023-02-20 //get => new Prism.Commands.DelegateCommand(() => //{ // int num = 0; // RunEventCnt = 0; // SystemRunTime = DateTime.Now; // DateTime alarmEndTime = DateTime.Now; // GlobalData.ListAlarmEventId = new List(); // if (GlobalData.IsDesign) // { // alarmEndTime = GlobalData.DStartTime; // RefreshInterval = GlobalData.DRefreshInterval; // } // var taskAlarm = Task.Factory.StartNew(new System.Action(async () => // { // while (GlobalData.IsRunning) // { // TaskFactory taskfactory = new TaskFactory(); // List taskList = new List(); // #region BLL模式 // int StatCount = searchMsEventBLL.GetEvents(alarmEndTime.AddHours(-1), alarmEndTime).Count(); // if (StatCount > 0) // { // //通知更新一小时前事件数量 // this.ea.GetEvent().Publish(StatCount); // } // //DateTime deadlineTime = alarmEndTime.AddSeconds(1); // //Console.WriteLine(deadlineTime.ToString()); // //MmEventEntity mmee = searchMsEventBLL.GetLastEvent(deadlineTime); // //MmEventEntity mmee = searchMsEventBLL.GetLastEvent(); // var mms = searchMsEventBLL.GetEvents(alarmEndTime.AddMinutes(-10), alarmEndTime); // //var mms = searchMsEventBLL.GetLastNewEvents(3); // Stopwatch watch = new Stopwatch(); // watch.Start(); // if (mms != null) // { // foreach (var mmee in mms) // { // if (GlobalData.ListAlarmEventId.Contains(mmee.EventID)) // { // continue; // } // GlobalData.ListAlarmEventId.Add(mmee.EventID); // if (mmee.EventTimeStr != GlobalData.LastEvent.EventTimeStr) // { // //Stopwatch watch = new Stopwatch(); // //watch.Start(); // GlobalData.LastEvent = new MmEvent(); // GlobalData.LastEvent.WorkAreaID = mmee.WorkAreaID; // GlobalData.LastEvent.EventID = mmee.EventID; // GlobalData.LastEvent.EventTime = mmee.EventTime; // GlobalData.LastEvent.EventTimeStr = mmee.EventTimeStr; // GlobalData.LastEvent.X = mmee.X; // GlobalData.LastEvent.Y = mmee.Y; // GlobalData.LastEvent.Z = mmee.Z; // GlobalData.LastEvent.ML = mmee.ML; // GlobalData.LastEvent.LocSta = mmee.LocSta; // GlobalData.LastEvent.MLSta = mmee.MLSta; // GlobalData.LastEvent.RMS = mmee.RMS; // GlobalData.LastEvent.Energy = mmee.Energy; // LocalRealtimeResultEntity lrre = new LocalRealtimeResultEntity(); // lrre.RTEventID = mmee.EventID; // lrre.WorkAreaID = mmee.WorkAreaID; // lrre.EventTime = mmee.EventTimeStr; // lrre.OriginTime = mmee.EventTimeStr; // lrre.X = mmee.X; // lrre.Y = mmee.Y; // lrre.Z = mmee.Z; // lrre.ML = Math.Round(mmee.ML, 2); // lrre.RMS = Math.Round(mmee.RMS, 3); // lrre.LocSta = mmee.LocSta; // lrre.MLSta = mmee.MLSta; // lrre.SetEnergy(); // taskList.Add(taskfactory.StartNew(() => // { // Console.WriteLine($"=============>{lrre.EventTime}开始下载!\t{DateTime.Now.ToString("o")}"); // DownloadWaveDataTask(lrre.EventTime, GlobalConfig.UseWaveDataTable); // })); // await taskfactory.ContinueWhenAny(taskList.ToArray(), t => // { // this.ea.GetEvent().Publish(num++); // Console.WriteLine($"------------->{lrre.EventTime}发送下载完成通知!\t{DateTime.Now.ToString("o")}"); // }); // //检查本地数据库是否有此事件 // var re = fsqlSqLite.Select().Where(rel => rel.RTEventID == lrre.RTEventID).ToOne(); // //如果没有,添加到本地库 // if (re == null) // { // //下载波形文件,Json文件 // //待修改为多线程下载,下载完成后回调计算震源机制、主频、插入本地数据库操作,2023-02-04; // //DownloadWaveDataTask(lrre.EventTime, GlobalConfig.UseWaveDataTable); // //taskList.Add(taskfactory.StartNew(() => // //{ // // Console.WriteLine($"=============>{lrre.EventTime}开始下载!\t{DateTime.Now.ToString("o")}"); // // DownloadWaveDataTask(lrre.EventTime, GlobalConfig.UseWaveDataTable); // //})); // //await taskfactory.ContinueWhenAny(taskList.ToArray(), t => // //{ // // this.ea.GetEvent().Publish(num++); // // Console.WriteLine($"------------->{lrre.EventTime}发送下载完成通知!\t{DateTime.Now.ToString("o")}"); // //}); // int dominFreq = GetDominFreq(lrre.EventTime); // if (dominFreq < 5) // { // dominFreq = new Random((int)DateTime.Now.Ticks).Next(15, 60); // } // lrre.DominantFreq = dominFreq; // await fsqlSqLite.Insert(lrre).ExecuteIdentityAsync(); // } // //查询本地库realtimefocalmechanism是否有此记录,如果没有新增记录 // var rf = fsqlSqLite.Select().Where(rel => rel.EventID == lrre.RTEventID).ToOne(); // if (rf == null) // { // RealtimeFocalmechanismEntity rfe = new RealtimeFocalmechanismEntity(); // rfe.DominantFreq = lrre.DominantFreq; // rfe.EventID = lrre.RTEventID; // await fsqlSqLite.Insert(rfe).ExecuteIdentityAsync(); // } // RemoteRealtimeResultEntity rrre = new RemoteRealtimeResultEntity(lrre); // //如果大于设定 // if (lrre.Energy >= alarmThreshold) // { // //通知预警页面图表变化 // this.ea.GetEvent().Publish(new AlarmEventPayload(rrre)); // //添加预警事件到右侧列表 // _dispatcher.Invoke(new System.Action(() => // { // //GlobalData.DisplayEventResults.Add(new GridItemEventResult(realEvent)); // GlobalData.GridEvents.Insert(0, new GridItemEventResult(rrre)); // })); // //通知显示更新,线程有问题 // if (!GlobalData.AlarmEvents.Contains(rrre)) // { // GlobalData.AlarmEvents.Add(rrre); // } // //GlobalData.DisplayEvents.Add(realEvent); // this.ea.GetEvent().Publish("更新事件"); // ResultCount = GlobalData.GridEvents.Count(); // CurAlarmLevel = ListAlarmLevel.First(lal => lal.MaxEnergy >= rrre.Energy && lal.MinEnergy <= lrre.Energy); // AlarmRecordEntity arent = new AlarmRecordEntity(); // arent.EventId = lrre.RTEventID; // arent.AlarmTime = lrre.OriginTime; // arent.AlarmLevel = CurAlarmLevel.Level; // arent.Energy = lrre.Energy; // //写入报警记录 // var haveAre = fsqlSqLite.Select().Where(are => are.EventId == arent.EventId).ToOne(); // if (haveAre == null) // { // await fsqlSqLite.Insert(arent).ExecuteIdentityAsync(); // } // //声音报警 // if (canPlayAlarmSound) // { // alarmPlayer.PlaySync(); // } // //报警数量 // RunEventCnt++; // } // //watch.Stop(); // //TimeSpan timespan = watch.Elapsed; // //Console.WriteLine("++++++++++++++++时长:" + timespan.TotalMilliseconds); // } // } // } // watch.Stop(); // TimeSpan timespan = watch.Elapsed; // if (GlobalData.IsDesign) // { // await Task.Delay(2000); // alarmEndTime = alarmEndTime.AddMinutes(10); // } // else // { // int delayMillSec = (int)(RefreshInterval * 1000 - timespan.TotalMilliseconds); // Console.WriteLine($"运行时长:{timespan.TotalMilliseconds}\t延迟时长:{delayMillSec}"); // if (delayMillSec < 0) // { // delayMillSec = 0; // } // await Task.Delay(delayMillSec); // alarmEndTime = DateTime.Now; // } // #endregion // } // })); // var taskRunTime = Task.Factory.StartNew(new System.Action(async () => // { // while (GlobalData.IsRunning) // { // TimeSpan ts = DateTime.Now - SystemRunTime; // RunSpan = ts.Hours.ToString() + "小时" + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒"; // await Task.Delay(1000); // } // })); // GlobalData.TaskList.Add(taskAlarm); // GlobalData.TaskList.Add(taskRunTime); //}); #endregion } public EventListViewModel(IUnityContainer unityContainer, IEventAggregator ea, ISearchMsEventBLL searchMsEventBLL,ILogHelper logHelper) { _dispatcher = unityContainer.Resolve(); this.ea = ea; this.searchMsEventBLL = searchMsEventBLL; this._logHelper = logHelper; //this.remoteDownloadDataBLL = remoteDownloadDataBLL; this.StartTime = DateTime.Now.AddDays(-1); this.EndTime = DateTime.Now; //StartMonitoringCommand=new Prism.Commands.DelegateCommand(test,) //ProcessAlarmCommand=new COMMAND //AlarmSettingConfig = new AlarmSetting(); using (System.IO.StreamReader sr = new System.IO.StreamReader(AppDomain.CurrentDomain.BaseDirectory + System.Configuration.ConfigurationManager.AppSettings["AlarmSetting"].ToString())) { AlarmSettingConfig = JsonConvert.DeserializeObject(sr.ReadToEnd()); } AlarmThreshold = AlarmSettingConfig.AlarmThreshold; RefreshInterval = AlarmSettingConfig.RefreshInterval; //RefreshInterval = int.Parse(System.Configuration.ConfigurationManager.AppSettings["RefreshInterval"].ToString()); CurAlarmMusic = AlarmSettingConfig.AlarmSound; ListAlarmLevel = new List(); using (System.IO.StreamReader sr = new System.IO.StreamReader(AppDomain.CurrentDomain.BaseDirectory + System.Configuration.ConfigurationManager.AppSettings["AlarmLevelConfig"].ToString())) { ListAlarmLevel = JsonConvert.DeserializeObject>(sr.ReadToEnd()); } CurAlarmLevel = ListAlarmLevel.First(la => la.Level == 1); ListAlramMusic = new List(); string[] alarmTmpArray = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + "audio", "*.wav"); for (int i = 0; i < alarmTmpArray.Length; i++) { ListAlramMusic.Add(Path.GetFileName(alarmTmpArray[i])); } //CurAlarmMusic = ListAlramMusic[0]; } void StartMonitorning() { if (!GlobalData.IsRunning) { this._logHelper.Debug(this, "===========End==============>>>"); //LogObject.Log(MethodBase.GetCurrentMethod().Name).Info("===========End==============>>>"); Task.WaitAll(GlobalData.TaskList.ToArray()); Task.Delay(2000); } else { this._logHelper.Debug(this,"===========Startup==============>>>"); //LogObject.Log(MethodBase.GetCurrentMethod().Name).Info("===========Startup==============>>>"); RunEventCnt = 0; SystemRunTime = DateTime.Now; DateTime alarmTime= DateTime.Now; DateTime eventFreqTime = DateTime.Now; DateTime alarmEndTime = DateTime.Now; GlobalData.ListAlarmEventId = new List(); GlobalData.AlarmEvents = new List(); GlobalData.ReceivedEvents = new List(); GlobalData.GridEvents = new ObservableCollection(); if (GlobalConfig.IsDesign) { alarmEndTime = GlobalConfig.DStartTime; RefreshInterval = GlobalConfig.DRefreshInterval; } //新事件查询,每10秒查询一次,如果有新事件,需要下载二进制数据,数据大小:5m左右,因为是远程数据库,下载需要5秒左右。 var taskAlarm = Task.Factory.StartNew(new System.Action(async () => { while (GlobalData.IsRunning) { try { if (GlobalConfig.IsDesign) { await Task.Delay(3000); alarmEndTime = alarmEndTime.AddMinutes(10); //Console.WriteLine($"运行时长:{timespan.TotalMilliseconds}\t"); } else if ((DateTime.Now - alarmTime).TotalMilliseconds >= RefreshInterval * 1000) { TaskFactory taskfactory = new TaskFactory(); List taskList = new List(); #region BLL模式 alarmTime = DateTime.Now; //int StatCount = searchMsEventBLL.GetEvents(alarmEndTime.AddHours(-1), alarmEndTime).Count(); //if (StatCount > 0) //{ // //通知更新一小时前事件数量 // this.ea.GetEvent().Publish(StatCount); //} //DateTime deadlineTime = alarmEndTime.AddSeconds(1); //Console.WriteLine(deadlineTime.ToString()); //MmEventEntity mmee = searchMsEventBLL.GetLastEvent(deadlineTime); //MmEventEntity mmee = searchMsEventBLL.GetLastEvent(); //var mms = searchMsEventBLL.GetEvents(alarmEndTime.AddMinutes(-10), alarmEndTime); //Stopwatch watch = new Stopwatch(); //watch.Start(); var mms = searchMsEventBLL.GetLastNewEvents(2); if (mms != null) { foreach (var mmee in mms) { //if ((DateTime.Now- mmee.EventTime).TotalSeconds<720) { if (GlobalData.ListAlarmEventId.Contains(mmee.EventID)) { continue; } GlobalData.ListAlarmEventId.Add(mmee.EventID); if (mmee.EventTimeStr != GlobalData.LastEvent.EventTimeStr) { //Stopwatch watch = new Stopwatch(); //watch.Start(); GlobalData.LastEvent = new MmEvent(); GlobalData.LastEvent.WorkAreaID = mmee.WorkAreaID; GlobalData.LastEvent.EventID = mmee.EventID; GlobalData.LastEvent.EventTime = mmee.EventTime; GlobalData.LastEvent.EventTimeStr = mmee.EventTimeStr; GlobalData.LastEvent.X = mmee.X; GlobalData.LastEvent.Y = mmee.Y; GlobalData.LastEvent.Z = mmee.Z; GlobalData.LastEvent.ML = mmee.ML; GlobalData.LastEvent.LocSta = mmee.LocSta; GlobalData.LastEvent.MLSta = mmee.MLSta; GlobalData.LastEvent.RMS = mmee.RMS; GlobalData.LastEvent.Energy = mmee.Energy; LocalRealtimeResultEntity lrre = new LocalRealtimeResultEntity(); lrre.RTEventID = mmee.EventID; lrre.WorkAreaID = mmee.WorkAreaID; lrre.EventTime = mmee.EventTimeStr; lrre.OriginTime = mmee.EventTimeStr; lrre.X = mmee.X; lrre.Y = mmee.Y; lrre.Z = mmee.Z; lrre.ML = Math.Round(mmee.ML, 2); lrre.RMS = Math.Round(mmee.RMS, 3); lrre.LocSta = mmee.LocSta; lrre.MLSta = mmee.MLSta; lrre.SetEnergy(); string eventTimeStr = mmee.EventTimeStr; string datePath = eventTimeStr.Substring(0, 4) + eventTimeStr.Substring(5, 2) + eventTimeStr.Substring(8, 2); string dataFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\"; string dataFileName = "HA." + eventTimeStr.Substring(0, 4) + eventTimeStr.Substring(5, 2) + eventTimeStr.Substring(8, 2) + eventTimeStr.Substring(10, 3) + eventTimeStr.Substring(14, 2) + eventTimeStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString; string jsonStr = ".json"; string mseedStr = ".mseed"; if (!Directory.Exists(dataFilePath)) { Directory.CreateDirectory(dataFilePath); } //设置事件默认主频为15Hz; lrre.DominantFreq = 15; //查询事件Json文件是否已下载 if (File.Exists(dataFilePath + dataFileName + jsonStr)) { FileInfo fileInfo = new FileInfo(dataFilePath + dataFileName + jsonStr); if (fileInfo.Length > 2000) { lrre.DominantFreq = GlobalData.GetDominFreq(eventTimeStr); } else { #region 同步方式 int res = new DownloadJsonFile().Download(eventTimeStr, dataFilePath, dataFileName + jsonStr, GlobalConfig.UseWaveDataTable); if (res > -1) { FileInfo fileInfo2 = new FileInfo(dataFilePath + dataFileName + jsonStr); if (fileInfo2.Length > 2000) { //目前提取的为半周期 lrre.DominantFreq = GlobalData.GetDominFreq(eventTimeStr); } //else //{ // lrre.DominantFreq = 15; //} } //else //{ // lrre.DominantFreq = 15; //} #endregion } } else { #region 同步方式 int res = new DownloadJsonFile().Download(eventTimeStr, dataFilePath, dataFileName + jsonStr, GlobalConfig.UseWaveDataTable); if (res > -1) { FileInfo fileInfo2 = new FileInfo(dataFilePath + dataFileName + jsonStr); if (fileInfo2.Length > 2000) { //目前提取的为半周期 lrre.DominantFreq = GlobalData.GetDominFreq(eventTimeStr); } //else //{ // lrre.DominantFreq = 15; //} } //else //{ // lrre.DominantFreq = 15; //} #endregion #region 异步方式 //TaskData taskData = new TaskData(); //taskData.EventTimeStr = mmee.EventTimeStr; //taskData.Tasks = new Task(() => //{ // int res = this.remoteDownloadDataBLL.DownLoadJsonData(eventTimeStr, dataFilePath, dataFileName + jsonStr, GlobalConfig.UseWaveDataTable); // if (res > -1) // { // taskData.IsComplete = true; // } // //Console.WriteLine(taskData.IsComplete); //}); //taskData.CallBack = (string res) => //{ // int domin = 0; // if (taskData.IsComplete) // { // domin = GetDominFreq(taskData.EventTimeStr); // } // this.ea.GetEvent().Publish(domin); //}; //TaskQueue.Instance.AddTaskAndRuning(taskData); #endregion } //通知主频更新 this.ea.GetEvent().Publish(lrre.DominantFreq); //查询波形数据是否已下载 if (File.Exists(dataFilePath + dataFileName + mseedStr)) { //待完善主频 //Console.WriteLine("15Hz"); } else { TaskData taskData = new TaskData(); taskData.EventTimeStr = mmee.EventTimeStr; taskData.Tasks = new Task(() => { int res = new DownloadWavedata().Download(eventTimeStr, dataFilePath, dataFileName + mseedStr, GlobalConfig.UseWaveDataTable); if (res > -1) { taskData.IsComplete = true; } //Console.WriteLine(taskData.IsComplete); }); taskData.CallBack = (string res) => { //通知页面更新 }; TaskQueue.Instance.AddTaskAndRuning(taskData); } //检查本地数据库是否有此事件 var re = fsqlSqLite.Select().Where(rel => rel.RTEventID == lrre.RTEventID).ToOne(); //如果没有,添加到本地库 if (re == null) { //int dominFreq = GetDominFreq(lrre.EventTime); //if (dominFreq < 5) //{ // dominFreq = new Random((int)DateTime.Now.Ticks).Next(15, 60); //} //lrre.DominantFreq = dominFreq; await fsqlSqLite.Insert(lrre).ExecuteIdentityAsync(); } //查询本地库realtimefocalmechanism是否有此记录,如果没有新增记录 var rf = fsqlSqLite.Select().Where(rel => rel.EventID == lrre.RTEventID).ToOne(); if (rf == null) { RealtimeFocalmechanismEntity rfe = new RealtimeFocalmechanismEntity(); rfe.DominantFreq = lrre.DominantFreq; rfe.EventID = lrre.RTEventID; await fsqlSqLite.Insert(rfe).ExecuteIdentityAsync(); } RemoteRealtimeResultEntity rrre = new RemoteRealtimeResultEntity(lrre); //通知页面更新 //通知预警页面图表变化 this.ea.GetEvent().Publish(new AlarmEventPayload(rrre)); //添加预警事件到右侧列表 _dispatcher.Invoke(new System.Action(() => { //GlobalData.DisplayEventResults.Add(new GridItemEventResult(realEvent)); GlobalData.GridEvents.Insert(0, new GridItemEventResult(rrre, false)); })); ResultCount = GlobalData.GridEvents.Count(); //通知显示更新,线程有问题,已解决_20230228 if (!GlobalData.ReceivedEvents.Contains(rrre)) { GlobalData.ReceivedEvents.Add(rrre); } this.ea.GetEvent().Publish("新事件"); //如果大于设定 if (lrre.Energy >= alarmThreshold) { //通知显示更新,线程有问题,已解决_20230228 if (!GlobalData.AlarmEvents.Contains(rrre)) { GlobalData.AlarmEvents.Add(rrre); } CurAlarmLevel = ListAlarmLevel.First(lal => lal.MaxEnergy >= rrre.Energy && lal.MinEnergy <= lrre.Energy); AlarmRecordEntity arent = new AlarmRecordEntity(); arent.EventId = lrre.RTEventID; arent.AlarmTime = lrre.OriginTime; arent.AlarmLevel = CurAlarmLevel.Level; arent.Energy = lrre.Energy; //写入报警记录 var haveAre = fsqlSqLite.Select().Where(are => are.EventId == arent.EventId).ToOne(); if (haveAre == null) { await fsqlSqLite.Insert(arent).ExecuteIdentityAsync(); } //声音报警 if (canPlayAlarmSound) { alarmPlayer.PlaySync(); } //报警数量 RunEventCnt++; } //watch.Stop(); //TimeSpan timespan = watch.Elapsed; //Console.WriteLine("++++++++++++++++时长:" + timespan.TotalMilliseconds); } } } } //watch.Stop(); //TimeSpan timespan = watch.Elapsed; //this._logHelper.Debug(this, $"eventFreqTime:{eventFreqTime.ToString("F")},查询正常"); #endregion //else //{ // int delayMillSec = (int)(RefreshInterval * 1000 - timespan.TotalMilliseconds); // //Console.WriteLine($"运行时长:{timespan.TotalMilliseconds}\t延迟时长:{delayMillSec}"); // if (delayMillSec < 0) // { // delayMillSec = 0; // } // await Task.Delay(delayMillSec); // alarmEndTime = DateTime.Now; //} } await Task.Delay(1000); } catch (Exception ex) { string strLog = String.Format("事件查询,[Thread ID:{0}]{1}", Task.CurrentId, ex.Message); this._logHelper.Error(this, strLog); string strInfoLog = String.Format("事件查询异常结束,系统运行时长:{0}", (DateTime.Now-SystemRunTime).TotalSeconds); this._logHelper.Error(this, strInfoLog); //LogObject.Log(MethodBase.GetCurrentMethod().Name).Error(ex.Message); //throw; } } })); //事件数量统计查询,每60秒查询一次,大多数情况运行正常,如果遇到网络不好的情况或者新事件查询功能在下载数据,数据库连接会出问题。 var taskEventFreq = Task.Factory.StartNew(new System.Action(async () => { while (GlobalData.IsRunning) { try { //eventFreqTime=DateTime.Now; if ((DateTime.Now - eventFreqTime).TotalMilliseconds >= 60000) { DateTime st = eventFreqTime.AddSeconds(-3600); DateTime et = eventFreqTime; //int StatCount = fsqlTencent.Select() // .Where(pp => DateTime.Parse(pp.EventTime).Ticks > st.Ticks && // DateTime.Parse(pp.EventTime).Ticks <= et.Ticks).ToList().Count(); int StatCount = searchMsEventBLL.GetEvents(st, et).Count(); //通知更新一小时前事件数量 this.ea.GetEvent().Publish(StatCount); //this._logHelper.Debug(this, $"eventFreqTime:{eventFreqTime.ToString("F")},统计正常"); eventFreqTime = DateTime.Now; } await Task.Delay(1000); } catch (Exception ex) { string strLog = String.Format("[事件统计,Thread ID:{0}]{1}", Task.CurrentId, ex.Message); this._logHelper.Error(this, strLog); string strInfoLog = String.Format("事件统计异常结束,统计时间:{0}", eventFreqTime.ToString()); this._logHelper.Error(this, strInfoLog); //throw; } } })); var taskRunTime = Task.Factory.StartNew(new System.Action(async () => { while (GlobalData.IsRunning) { TimeSpan ts = DateTime.Now - SystemRunTime; RunSpan = ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时" + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒"; await Task.Delay(1000); } })); GlobalData.TaskList.Add(taskAlarm); GlobalData.TaskList.Add(taskEventFreq); GlobalData.TaskList.Add(taskRunTime); } } bool CanStartMonitor() { return !GlobalData.IsRunning; } private void PutSamplesToChart(DataGeneratedEventArgs args) { //(Application.Current. as View).chart1.BeginUpdate(); } private void DownloadWaveDataTask(string eventTimeStr, string tableName) { string downLoadStr = eventTimeStr; string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2); string mseedStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3) + downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString; string mseedPath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\"; string savePath = GlobalConfig.ProjectConfig.TxtFilePath + "\\" + datePath + "\\" + mseedStr + ".txt"; //var taskRunTime = Task.Factory.StartNew(new Action(() => //{ if (!File.Exists(mseedPath + mseedStr + ".mseed")) { if (!Directory.Exists(mseedPath)) { Directory.CreateDirectory(mseedPath); } searchMsEventBLL.DownLoadWavedata(downLoadStr, mseedPath, mseedStr, tableName); if (!File.Exists(savePath)) { if (!Directory.Exists(Path.GetDirectoryName(savePath))) { Directory.CreateDirectory(Path.GetDirectoryName(savePath)); } MSeed2Asc(mseedPath + mseedStr + ".mseed", savePath); } //Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "下载完成!" }); } else { if (!File.Exists(savePath)) { if (!Directory.Exists(Path.GetDirectoryName(savePath))) { Directory.CreateDirectory(Path.GetDirectoryName(savePath)); } MSeed2Asc(mseedPath + mseedStr + ".mseed", savePath); } //Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "已存在!" }); } //})); // GlobalData.TaskList.Add(taskRunTime); } private void DownloadWaveData(string eventTimeStr) { string downLoadStr = eventTimeStr; string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2); string mseedStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3) + downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString; string mseedPath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\"; string savePath = GlobalConfig.ProjectConfig.TxtFilePath + "\\" + datePath + "\\" + mseedStr + ".txt"; if (!File.Exists(mseedPath + mseedStr + ".mseed")) { if (!Directory.Exists(mseedPath)) { Directory.CreateDirectory(mseedPath); } searchMsEventBLL.DownLoadWavedata(downLoadStr, mseedPath, mseedStr, GlobalConfig.UseWaveDataTable); if (!File.Exists(savePath)) { if (!Directory.Exists(Path.GetDirectoryName(savePath))) { Directory.CreateDirectory(Path.GetDirectoryName(savePath)); } MSeed2Asc(mseedPath + mseedStr + ".mseed", savePath); } //Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "下载完成!" }); } else { if (!File.Exists(savePath)) { if (!Directory.Exists(Path.GetDirectoryName(savePath))) { Directory.CreateDirectory(Path.GetDirectoryName(savePath)); } MSeed2Asc(mseedPath + mseedStr + ".mseed", savePath); } //Dialog.Show(new TextDialog() { ShowText = mseedPath + mseedStr + ".mseed" + "已存在!" }); } } public void MSeed2Asc(string filePath, string savePath) { using (Process compiler = new Process()) { compiler.StartInfo.FileName = "mseed2ascii.exe"; compiler.StartInfo.Arguments = filePath + " -o " + savePath; compiler.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; compiler.Start(); compiler.WaitForExit(); } } } }