using DevExpress.XtraCharts; using DevExpress.XtraEditors; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System.Data; using System.IO; using Yw; using Yw.WinFrmUI; namespace IBox.WinFrmUI { public partial class IBoxFormMonitor : DocumentPage { private string startCode = "[&start&]"; private string endCode = "[&end&]"; private string paramCode = "[¶m&]"; private string getbaseCode = "getbase"; private string getrealrecordCode = "getrealrecord"; private string gethistoryrecordCode = "gethistoryrecord"; private string getalarmbydayCode = "getalarmbyday"; private string getbysignalidofdayrangeCode = "getbysignalidofdayrange"; //Stopwatch sw = new Stopwatch(); //string swstr=string.Empty; private List monitorValueAlarmRecords = new List(); private List dataGridMonitorViewModels = new List(); private List pumpRunStatusModels = new List(); private List pumpEnergyViewModels = new List(); public IBoxFormMonitor() { this.PageTitle.Caption = "实时监测"; InitializeComponent(); this.gridView1.SetNormalView(); this.dateEdit1.Text = DateTime.Now.ToString("yyyy-MM-dd"); this.dateEdit2.Text = DateTime.Now.ToString("yyyy-MM-dd"); _points.View.Color = Color.Red; _points.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.False; _points.ShowInLegend = false; _line.ShowInLegend = true; // _line.LegendTextPattern = ""; } //private void WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) //{ // var j = JsonHelper.Json2Object(e.WebMessageAsJson); // var oper = new // { // oper = "setToken", // dataValue = "" // }; // switch (j.Oper) // { // case "loadCompleted": // break; // } //} private void TestData() { #region 测试数据 this.pumpRunStatusModels = new List(); this.pumpRunStatusModels.Add(new PumpRunStatusViewModel() { ID = 1, Name = "1#机组", BootTimes = 50, ContinutRunTime = 1000, DateTime = DateTime.Now, RunStatus = 1, TotalRunTime = 1000, }); this.pumpRunStatusModels.Add(new PumpRunStatusViewModel() { ID = 2, Name = "2#机组", BootTimes = 100, ContinutRunTime = 1300, DateTime = DateTime.Now, RunStatus = 0, TotalRunTime = 1800, }); this.pumpRunStatusModels.Add(new PumpRunStatusViewModel() { ID = 3, Name = "3#机组", BootTimes = 400, ContinutRunTime = 1500, DateTime = DateTime.Now, RunStatus = 1, TotalRunTime = 2000, }); this.pumpRunStatusModels.Add(new PumpRunStatusViewModel() { ID = 4, Name = "4#机组", BootTimes = 100, ContinutRunTime = 800, DateTime = DateTime.Now, RunStatus = 0, TotalRunTime = 1300, }); this.Invoke(new Action(() => { this.pumpRunStatusViewModelBindingSource.DataSource = this.pumpRunStatusModels; })); pumpEnergyViewModels = new List(); pumpEnergyViewModels.Add(new PumpEnergyViewModel() { Day = "2024-4-14", Electricity = 4172, Supply = 50510, EnergyOfWater = (decimal)82.04 }); pumpEnergyViewModels.Add(new PumpEnergyViewModel() { Day = "2024-4-15", Electricity = 3308, Supply = 32530, EnergyOfWater = (decimal)80.14 }); pumpEnergyViewModels.Add(new PumpEnergyViewModel() { Day = "2024-4-16", Electricity = 3378, Supply = 42630, EnergyOfWater = (decimal)73.34 }); pumpEnergyViewModels.Add(new PumpEnergyViewModel() { Day = "2024-4-17", Electricity = 4178, Supply = 51530, EnergyOfWater = (decimal)81.34 }); this.Invoke(new Action(() => { this.pumpEnergyViewModelBindingSource.DataSource = pumpEnergyViewModels; })); #endregion 测试数据 } private void EboxForm_Load(object sender, EventArgs e) { //BluetoothHelper.GetInstance().SMR -= null; //BluetoothHelper.GetInstance().SMR += new BluetoothHelper.ShowMessReturn(GetReceive); //BluetoothHelper.GetInstance().ListenerData(); Thread.Sleep(500); SendText(startCode + getbaseCode + paramCode + endCode); _diagram.EnableAxisXScrolling = true; _diagram.EnableAxisYScrolling = true; _diagram.EnableAxisXZooming = true; _diagram.EnableAxisYZooming = true; //SetTimer(); } public void GetReceive(string msg) { if (!this.IsHandleCreated || this.IsDisposed || string.IsNullOrEmpty(msg)) return; if (msg.StartsWith("error:") && msg.Contains("目标主机坏了")) { MessageBoxHelper.ShowError("m 蓝牙设备连接失败,请重试!"); return; } if (!string.IsNullOrEmpty(msg) && msg.Contains(startCode)) { var order = msg.Replace(endCode, "").Replace(startCode, "").Trim(); SetOrder(order); } else MessageBoxHelper.ShowError("m 蓝牙设备连接失败!"); } private void SetOrder(string order) { var smsg = order.Split(new string[] { paramCode }, StringSplitOptions.RemoveEmptyEntries); if (smsg.Length < 2) { _diagram.DefaultPane.Visibility = ChartElementVisibility.Hidden; return; } _diagram.DefaultPane.Visibility = ChartElementVisibility.Visible; switch (smsg[0].Trim()) { case "getbase": var getbaselist = JsonHelper.Json2Object>(smsg[1].Trim()); BindGrid(getbaselist); WaitFormHelper.HideWaitForm(); break; case "gethistoryrecord": var b = smsg[1].Trim(); var gethistoryrecordlist = new List(); if (!string.IsNullOrEmpty(b)) { var c = b.Split('|'); foreach (var item in c) { var m = new MonitorRecord().FromString(item); gethistoryrecordlist.Add(m); } } //SetChartData(gethistoryrecordlist); break; case "getalarmbyday": //var getalarmbydaylist = JsonHelper.Json2Object>(smsg[1].Trim()); //monitorValueAlarmRecords = getalarmbydaylist; //this.bindingSource1.DataSource = dataGridMonitorViewModels; var l = smsg[1].Trim(); SetAlarmByDay(l); //this.gridView2.RefreshData(); break; case "getbysignalidofdayrange": var getbysignalidofdayrangelist = JsonHelper.Json2Object>(smsg[1].Trim()); break; case "getrealrecord": var getrealrecordlist = JsonHelper.Json2Object>(smsg[1].Trim()); SetRealRecord(getrealrecordlist); break; } } public void SetAlarmByDay(string l, bool isBlue = true) { var getalarmbydaylist = new List(); if (!string.IsNullOrEmpty(l)) { var c = l.Split('|'); foreach (var item in c) { var ml = new MonitorValueAlarmRecord().FromString(item); getalarmbydaylist.Add(ml); } monitorValueAlarmRecords = getalarmbydaylist; } if (isBlue) { this.Invoke(new Action(() => { this.monitorValueAlarmRecordBindingSource.DataSource = monitorValueAlarmRecords; })); } else { this.monitorValueAlarmRecordBindingSource.DataSource = monitorValueAlarmRecords; } } public void SetRealRecord(List getrealrecordlist, bool isBlue = true) { foreach (var item in dataGridMonitorViewModels) { var mf = getrealrecordlist.FirstOrDefault(bc => bc.SignalID == item.SignalID); if (mf != null) { item.DataValue = mf.DataValue; item.DataTime = mf.DataTime.ToString("yyyy-MM-dd HH:mm:ss"); //item.DataStatus =mf.DataStatus!=null && mf.DataStatus.Contains("2") ? eDataStatus.Warn : eDataStatus.Normal; } } if (isBlue) { this.Invoke(new Action(() => { this.bindingSource1.DataSource = dataGridMonitorViewModels; this.gridView1.RefreshData(); })); } else { this.bindingSource1.DataSource = dataGridMonitorViewModels; this.gridView1.RefreshData(); } } private List dataList = null; public void BindGrid(List list, bool isBlue = true) { dataList = new List(); foreach (var item in list) { foreach (var ml in item.MonitorList) { dataList.Add(new DataGridMonitorViewModel() { DataTime = !ml.DataTime.HasValue ? "-" : ml.DataTime?.ToString("yyyy-MM-dd HH:mm:ss"), DataValue = string.IsNullOrEmpty(ml.DataValue) ? "-" : ml.DataValue, GroupID = item.ID, GroupName = item.Name, MonitorName = ml.Name, SignalID = ml.SignalID, UnitName = ml.UnitName, DataStatus = ml.DataStatus, }); } } if (isBlue) { this.Invoke(new Action(() => { dataGridMonitorViewModels = dataList; this.bindingSource1.DataSource = dataGridMonitorViewModels; })); } else { dataGridMonitorViewModels = dataList; this.bindingSource1.DataSource = dataGridMonitorViewModels; this.gridView1.RefreshData(); } //var am = new GetAlarmByDayModel() { Day = DateTime.Now }; //SendText(startCode + getalarmbydayCode + paramCode + JsonHelper.Object2Json(am) + endCode); //WaitFrmHelper.HideWaitForm(); } private void gridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e) { currModel = this.gridView1.GetFocusedRow() as DataGridMonitorViewModel; } private void simpleButton1_Click(object sender, EventArgs e) { if (currModel == null) { MessageBoxHelper.ShowWarning("请先选中监测数据!"); return; } GetHistoryData(); //WaitFrmHelper.ShowWaitForm(); } private void simpleButton2_Click(object sender, EventArgs e) { this.dateEdit1.Text = this.dateEdit2.Text = DateTime.Parse(this.dateEdit1.Text).AddDays(-1).ToString("yyyy-MM-dd"); GetHistoryData(); } private void simpleButton3_Click(object sender, EventArgs e) { this.dateEdit1.Text = this.dateEdit2.Text = DateTime.Parse(this.dateEdit1.Text).AddDays(1).ToString("yyyy-MM-dd"); GetHistoryData(); } private void simpleButton4_Click(object sender, EventArgs e) { this.dateEdit1.Text = DateTime.Now.AddDays(-3).ToString("yyyy-MM-dd"); this.dateEdit2.Text = DateTime.Now.ToString("yyyy-MM-dd"); GetHistoryData(); } private Series _line { get { var s = this.chartControl1.GetSeriesByName("SeriesDataValue"); return s; } } private Series _points { get { var s = this.chartControl1.GetSeriesByName("SeriesAlarm"); return s; } } private XYDiagram _diagram { get { return this.chartControl1.Diagram as XYDiagram; } } List _realList = null; public void SetChartData(List list, bool isBlue) { _realList = list; if (isBlue) { this.Invoke(new Action(() => { this.chartControl1.BeginInit(); var maxY = list.Max(x => x.DataValue); var minY = list.Min(x => x.DataValue); _line.BindToData(list, "DataTime", "DataValue"); var alarmList = list.Where(d => d.DataStatus != null && d.DataStatus.Contains("2")).ToList(); _points.BindToData(alarmList, "DataTime", "DataValue"); _diagram.AxisY.VisualRange.SetMinMaxValues(minY, maxY); _diagram.AxisY.WholeRange.SetMinMaxValues(minY, maxY); this.chartControl1.EndInit(); })); } else { this.chartControl1.BeginInit(); var maxY = list.Max(x => string.IsNullOrEmpty(x.DataValue) ? 0 : double.Parse(x.DataValue)); var minY = list.Min(x => string.IsNullOrEmpty(x.DataValue) ? 0 : double.Parse(x.DataValue)); _line.BindToData(list, "DataTime", "DataValue"); var alarmList = list.Where(d => d.DataStatus != null && d.DataStatus.Contains("2")).ToList(); _points.BindToData(alarmList, "DataTime", "DataValue"); _diagram.AxisY.VisualRange.SetMinMaxValues(minY, maxY); _diagram.AxisY.WholeRange.SetMinMaxValues(minY, maxY); this.chartControl1.EndInit(); } } private void gridView1_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { currModel = this.gridView1.GetFocusedRow() as DataGridMonitorViewModel; } private DataGridMonitorViewModel currModel = null; private void gridView1_DoubleClick(object sender, EventArgs e) { //WaitFrmHelper.ShowWaitForm(); var r = this.gridView1.GetFocusedRow() as DataGridMonitorViewModel; currModel = r; //sw.Restart(); GetHistoryData(); } private void GetHistoryData() { var m = new MonitorHistoryQuery() { SignalID = currModel.SignalID, StartTime = dateEdit1.Text,//.Equals(DateTime.Now.ToString("yyyy-MM-dd")) ? DateTime.Now.AddMinutes(-20).ToString("yyyy-MM-dd HH:mm:ss") : dateEdit1.Text, EndTime = dateEdit2.Text//.Equals(DateTime.Now.ToString("yyyy-MM-dd")) ? DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") : dateEdit2.Text, }; SendText(startCode + gethistoryrecordCode + paramCode + JsonHelper.Object2Json(m) + endCode); } private void GetAlarmRange() { var m = new GetBySignalIDOfDayRangeModel() { SignalID = currModel.SignalID, StartDay = DateTime.Parse(dateEdit1.Text), EndDay = DateTime.Parse(dateEdit1.Text), }; SendText(startCode + getbysignalidofdayrangeCode + paramCode + JsonHelper.Object2Json(m) + endCode); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { SetTimer(); } private void SetTimer() { if (dataList == null) { return; } timer1.Interval = 5000; timer1.Enabled = true; timer1.Tick += new EventHandler(GetRealData); } private void GetRealData(object sender, EventArgs e) { SendText(startCode + getrealrecordCode + paramCode + endCode); } private void comboBox1_SelectedValueChanged(object sender, EventArgs e) { SetTimer(); } private void gridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if (e.Column.FieldName.Equals("DataValue")) { var b = gridView1.GetRow(e.RowHandle) as DataGridMonitorViewModel; if (b.DataStatus == eDataStatus.Warn) e.Appearance.ForeColor = Color.Red; } } private void button2_Click(object sender, EventArgs e) { BluetoothHelper.GetInstance().Close(); } private void tabbedControlGroup1_SelectedPageChanged(object sender, DevExpress.XtraLayout.LayoutTabPageChangedEventArgs e) { //MessageBox.Show(tabbedControlGroup1.SelectedTabPage.Tag.ToString()); } private void gridControl2_Click(object sender, EventArgs e) { } public event EventHandler SendData; private void SendText(string content) { //BluetoothHelper.GetInstance().SendData(content); SendData?.Invoke(null, content); } private void simpleButton5_Click(object sender, EventArgs e) { ExportXLS(); } public void ExportXLS() { try { if (_realList == null || _realList.Count == 0) { XtraMessageBox.Show("没有可导出的数据!"); return; } var dlg = new SaveFileDialog(); dlg.Filter = "EXCEL 文件(*.xls)|*.xls"; if (dlg.ShowDialog() != DialogResult.OK) return; HSSFWorkbook theBook = new HSSFWorkbook(); var theSheet1 = theBook.CreateSheet("Sheet1"); IRow rowTile = theSheet1.CreateRow(0); rowTile.CreateCell(0).SetCellValue("时间"); rowTile.CreateCell(1).SetCellValue(currModel.MonitorName + "(" + currModel.UnitName + ")"); for (int rowIndex = 1; rowIndex <= _realList.Count; rowIndex++) { int col = 0; IRow row = theSheet1.CreateRow(rowIndex); row.CreateCell(col).SetCellValue(_realList[rowIndex - 1].DataTime.ToString("yyyy/MM/dd HH:mm:00")); col++; row.CreateCell(col).SetCellValue(_realList[rowIndex - 1].DataValue); col++; } //强制Excel在打开时重新计算所有公式 theSheet1.ForceFormulaRecalculation = true; using (FileStream fs = File.OpenWrite(dlg.FileName)) { theBook.Write(fs); } XtraMessageBox.Show("导出成功"); } catch (Exception ex) { XtraMessageBox.Show(ex.ToString()); } } } }