using DevExpress.Pdf.Native.BouncyCastle.Ocsp; using DevExpress.XtraCharts; using DevExpress.XtraEditors; using IStation.BLL; using IStation.Model; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; namespace IStation.WinFrmUI.Monitor { public partial class PumpOutWaterAnaDlg : DocumentPage { public PumpOutWaterAnaDlg() { InitializeComponent(); this.PageTitle.Caption = "供水分析"; this.SurfaceGuid = new SurfaceGuid() { Modular = eModular.Basic, Function = this.PageTitle.Caption }; } PumpRunHelper _pumpRunHelper = new PumpRunHelper(); public class CurrentModel { /// /// 时间 /// public string Datetime { get; set; } /// /// 真实数据 /// public double RealData { get; set; } /// /// 预测数据 /// public double PredictData { get; set; } /// /// 差值百分比 /// public string PercentValue { get; set; } } private void SimpleBtnRefresh_Click(object sender, EventArgs e) { RefreshByMonth(); } //日期刷新 private void simpBtnRefreshDay_Click(object sender, EventArgs e) { RefreshByday(); } private void RefreshByday() { var Out2400 = this.chartControl2.Series[0]; var Out2700 = this.chartControl2.Series[1]; var line1 = this.chartControl2.Series[2]; var line2 = this.chartControl2.Series[3]; var line3 = this.chartControl2.Series[4]; var total = this.chartControl2.Series[5]; Out2400.Points.Clear(); Out2700.Points.Clear(); line1.Points.Clear(); line2.Points.Clear(); line3.Points.Clear(); total.Points.Clear(); XYDiagram main_diagram = chartControl2.Diagram as XYDiagram; var axisTime = main_diagram.AxisX; axisTime.VisualRange.Auto = true; axisTime.WholeRange.Auto = true; axisTime.WholeRange.SideMarginsValue = 0; axisTime.VisualRange.SideMarginsValue = 0; axisTime.WholeRange.SetMinMaxValues(this.textEditStartTime.DateTime, this.textEditEndTime.DateTime); axisTime.VisualRange.SetMinMaxValues(this.textEditStartTime.DateTime, this.textEditStartTime.DateTime.AddDays(2)); var totaldate = _pumpRunHelper.GetPumpOutTotalDayWaterData(this.textEditStartTime.DateTime, this.textEditEndTime.DateTime, out string error); if (totaldate != null) { foreach (var item in totaldate) { foreach (var value in item.pumpOutWater) { total.Points.Add(new SeriesPoint(value.DateTime, value.Total)); } } } for (DateTime currentDate = textEditStartTime.DateTime; currentDate <= textEditEndTime.DateTime; currentDate = currentDate.AddDays(1)) { ConstantLine constantLine = new ConstantLine("ConstantLine_" + currentDate.ToString("yyyyMMdd")) { AxisValue = currentDate.AddDays(1), Title = { Text = $"{currentDate.AddDays(1).ToString("dd号")}", Alignment = ConstantLineTitleAlignment.Far, DXFont = new System.Drawing.Font("宋体", 10)}, Color = Color.DeepSkyBlue, LineStyle = { Thickness = 2 }, Visible = true, LegendText = string.Empty, ShowInLegend = false, }; ((XYDiagram)chartControl2.Diagram).AxisX.ConstantLines.Add(constantLine); } if (this.textEditStartTime.DateTime != null && this.textEditEndTime.DateTime != null) { var daydate = _pumpRunHelper.GetPumpOutWaterData(this.textEditStartTime.DateTime, this.textEditEndTime.DateTime, 0, out string err); if (daydate != null) { foreach (var item in daydate) { foreach (var value in item.pumpOutWater) { Out2400.Points.Add(new SeriesPoint(value.DateTime, value.Out2400)); Out2700.Points.Add(new SeriesPoint(value.DateTime, value.Out2700)); line1.Points.Add(new SeriesPoint(value.DateTime, value.OutLine1)); line2.Points.Add(new SeriesPoint(value.DateTime, value.OutLine2)); line3.Points.Add(new SeriesPoint(value.DateTime, value.OutLine3)); } } } } if (Out2400.Points.Count == 0) { Out2400.ShowInLegend = false; } else Out2400.ShowInLegend = true; if (Out2700.Points.Count == 0) { Out2700.ShowInLegend = false; } else Out2700.ShowInLegend = true; if (line1.Points.Count == 0) { line1.ShowInLegend = false; } else line1.ShowInLegend = true; if (line2.Points.Count == 0) { line2.ShowInLegend = false; } else line2.ShowInLegend = true; if (line3.Points.Count == 0) { line3.ShowInLegend = false; } else line3.ShowInLegend = true; if (total.Points.Count == 0) { total.ShowInLegend = false; } else total.ShowInLegend = true; } private void RefreshByMonth() { var Out2400 = this.chartControl1.Series[0]; var Out2700 = this.chartControl1.Series[1]; var line1 = this.chartControl1.Series[2]; var line2 = this.chartControl1.Series[3]; var line3 = this.chartControl1.Series[4]; var total = this.chartControl1.Series[5]; Out2400.Points.Clear(); Out2700.Points.Clear(); line1.Points.Clear(); line2.Points.Clear(); line3.Points.Clear(); var monthdata = _pumpRunHelper.GetPumpOutMonthWaterData(out string error); if (monthdata != null) { foreach (var item in monthdata) { var allData = item.OutLine1 + item.OutLine2 + item.OutLine3 + item.Out2400 + item.Out2700; total.Points.Add(new SeriesPoint(item.DateTime, allData)); } } int startMonth = Convert.ToInt32(this.textEditStartMonth.EditValue); int endMonth = Convert.ToInt32(this.textEditEndMonth.EditValue); if (this.textEditStartMonth.EditValue != null && this.textEditEndMonth.EditValue != null) { var filteredData = monthdata.Where(x => x.DateTime.Month >= startMonth && x.DateTime.Month <= endMonth).ToList(); if (filteredData != null) { foreach (var item in filteredData) { Out2400.Points.Add(new SeriesPoint(item.DateTime, item.Out2400)); Out2700.Points.Add(new SeriesPoint(item.DateTime, item.Out2700)); line1.Points.Add(new SeriesPoint(item.DateTime, item.OutLine1)); line2.Points.Add(new SeriesPoint(item.DateTime, item.OutLine2)); line3.Points.Add(new SeriesPoint(item.DateTime, item.OutLine3)); } } } if (Out2400.Points.Count == 0) { Out2400.ShowInLegend = false; } else Out2400.ShowInLegend = true; if (Out2700.Points.Count == 0) { Out2700.ShowInLegend = false; } else Out2700.ShowInLegend = true; if (line1.Points.Count == 0) { line1.ShowInLegend = false; } else line1.ShowInLegend = true; if (line2.Points.Count == 0) { line2.ShowInLegend = false; } else line2.ShowInLegend = true; if (line3.Points.Count == 0) { line3.ShowInLegend = false; } else line3.ShowInLegend = true; if (total.Points.Count == 0) { total.ShowInLegend = false; } else total.ShowInLegend = true; } private void PumpOutWaterAnaDlg_Load(object sender, EventArgs e) { this.textEditStartTime.DateTime = new DateTime(2023, 3, 1); this.textEditEndTime.DateTime = new DateTime(2023, 3, 4); this.textEditStartMonth.EditValue = 2; this.textEditEndMonth.EditValue = 5; // RefreshByday(); // RefreshByMonth(); } List perdictvalue = new List(); //预测数据 (瞬时) List perdictvalueAcc = new List();//预测数据 (累计) //预测数据刷新 (瞬时) private void simpleBtnPredict_Click(object sender, EventArgs e) { WaitFrmHelper.ShowWaitForm(); List Prj1 = new List(); List Prj2 = new List(); var seriesreal = this.chartControlPredict.Series[0]; var seriesanareal = this.chartControlAna.Series[0]; var seriesperdict = this.chartControlPredict.Series[1]; var seriesanaperdict = this.chartControlAna.Series[1]; perdictvalue.Clear(); /*#region 平均数图表设置 XYDiagram main_diagram = chartControlPredict.Diagram as XYDiagram; var axisTime = main_diagram.AxisX; axisTime.VisualRange.Auto = true; axisTime.WholeRange.Auto = true; axisTime.WholeRange.SideMarginsValue = 0; axisTime.VisualRange.SideMarginsValue = 0; axisTime.WholeRange.SetMinMaxValues(this.textEditPredict.DateTime, this.textEditPredict.DateTime.AddDays(1)); axisTime.VisualRange.SetMinMaxValues(this.textEditPredict.DateTime, this.textEditPredict.DateTime.AddDays(1)); #endregion #region SSA算法图表设置 XYDiagram second_diagram = chartControlAna.Diagram as XYDiagram; var axisTime2 = second_diagram.AxisX; axisTime2.VisualRange.Auto = true; axisTime2.WholeRange.Auto = true; axisTime2.WholeRange.SideMarginsValue = 0; axisTime2.VisualRange.SideMarginsValue = 0; axisTime2.WholeRange.SetMinMaxValues(this.textEditPredict.DateTime, this.textEditPredict.DateTime.AddDays(1)); axisTime2.VisualRange.SetMinMaxValues(this.textEditPredict.DateTime, this.textEditPredict.DateTime.AddDays(1)); #endregion*/ seriesanareal.Points.Clear(); seriesanaperdict.Points.Clear(); seriesreal.Points.Clear(); seriesperdict.Points.Clear(); //真实数据 var realvalue = _pumpRunHelper.GetPumpOutTotalDayWaterData(this.textEditPredict.DateTime, this.textEditPredict.DateTime.AddDays(10), out string error); //真实数据 var realHistoryData = _pumpRunHelper.GetPumpOutTotalDayWaterData(this.textEditPredict.DateTime.AddDays(-Convert.ToInt32(this.textEditDay.EditValue)), this.textEditPredict.DateTime, out string err); var totalSumByTimePoint = realHistoryData .SelectMany(otdl => otdl.pumpOutWater) .GroupBy(totalDay => totalDay.DateTime.TimeOfDay) // 按照小时和分钟进行分组 .Select(group => { var time = group.First().DateTime.TimeOfDay; // 从组中获取时间 var totalSumForTimePoint = group.Sum(totalDay => totalDay.Total); // 在时间点分组中计算总和 return new { Time = time, Total = totalSumForTimePoint }; }); foreach (var item in totalSumByTimePoint) //方案一预测 { perdictvalue.Add(new TotalOneDay() { DateTime = this.textEditPredict.DateTime + item.Time, Total = item.Total / Convert.ToInt32(this.textEditDay.EditValue) }); } //算法预测数据 var anaPerdict = _pumpRunHelper.GetPredictOutTotalDayWaterData(this.textEditPredict.DateTime, Convert.ToInt32(textEditDay.EditValue), 2880,out string err1); #region 方案一平均数 Prj1.Clear(); List realdata = realvalue .SelectMany(item => item.pumpOutWater) .Where(pumpOut => pumpOut.DateTime.Minute == 0) .ToList(); List perdictdata = perdictvalue .Where(pumpOut => pumpOut.DateTime.Minute == 0) .ToList(); for (int i = 0; i < 24; i++) { Prj1.Add(new CurrentModel() { Datetime = realdata[i].DateTime.ToString("HH时"), RealData = Math.Round(realdata[i].Total, 2), PredictData = Math.Round(perdictdata[i].Total, 2), PercentValue = Convert.ToDecimal(((realdata[i].Total - perdictdata[i].Total) / perdictdata[i].Total) * 100).ToString("0.00") + "%" }); } if (realdata != null) { foreach (var item in realdata) { seriesreal.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); seriesanareal.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); } } if (perdictdata != null) { foreach (var item in perdictdata) { seriesperdict.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); } } if (seriesreal.Points.Count == 0) { seriesreal.ShowInLegend = false; } else seriesreal.ShowInLegend = true; if (seriesperdict.Points.Count == 0) { seriesperdict.ShowInLegend = false; } else seriesperdict.ShowInLegend = true; Prj1.Add(new CurrentModel() { Datetime = "总计", RealData = Prj1.Sum(item => item.RealData), PredictData = Prj1.Sum(item => item.PredictData) }); this.bindingSourceAna1.DataSource = Prj1; #endregion #region 方案二SSA算法 Prj2.Clear(); List anaperdict = anaPerdict .Where(pumpOut => pumpOut.DateTime.Minute == 0) .ToList(); for (int i = 0; i < 24; i++) { Prj2.Add(new CurrentModel() { Datetime = realdata[i].DateTime.ToString("HH时"), RealData = Math.Round(realdata[i].Total, 2), PredictData = Math.Round(anaperdict[i].Total, 2), PercentValue = Convert.ToDecimal(((realdata[i].Total - anaperdict[i].Total) / anaperdict[i].Total) * 100).ToString("0.00") + "%" }); } Prj2.Add(new CurrentModel() { Datetime = "总计", RealData = Prj2.Sum(item => item.RealData),PredictData=Prj2.Sum(item=>item.PredictData)}); if (anaperdict != null) { foreach (var item in anaperdict) { seriesanaperdict.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); } } if (seriesanaperdict.Points.Count == 0) { seriesanaperdict.ShowInLegend = false; } else seriesanaperdict.ShowInLegend = true; ((LineSeriesView)seriesanaperdict.View).LineStyle.DashStyle = DashStyle.Dash; ((LineSeriesView)seriesperdict.View).LineStyle.DashStyle = DashStyle.Dash; this.bindingSourceAna2.DataSource = Prj2; #endregion WaitFrmHelper.HideWaitForm(); } //保存到服务器 private void simpleBtnSave_Click(object sender, EventArgs e) { if (perdictvalue.Count == 0) return; var issave= _pumpRunHelper.SavePredictData(perdictvalue); if (issave) { XtraMessageBox.Show("保存成功!"); } else { XtraMessageBox.Show("保存失败!"); } } //累计方案刷新 private void simpleLabeRefresh_Click(object sender, EventArgs e) { WaitFrmHelper.ShowWaitForm(); List Prj1 = new List(); List Prj2 = new List(); var seriesreal = this.chartControlPredict1.Series[0]; var seriesanareal = this.chartControlAna1.Series[0]; var seriesperdict = this.chartControlPredict1.Series[1]; var seriesanaperdict = this.chartControlAna1.Series[1]; XYDiagram main_diagram = chartControlAna1.Diagram as XYDiagram; var axisTime = main_diagram.AxisX; axisTime.VisualRange.Auto = true; axisTime.WholeRange.Auto = true; axisTime.WholeRange.SideMarginsValue = 0; axisTime.VisualRange.SideMarginsValue = 0; axisTime.WholeRange.SetMinMaxValues(this.textEditPredictAcc.DateTime, this.textEditPredictAcc.DateTime.AddDays(30)) ; axisTime.VisualRange.SetMinMaxValues(this.textEditPredictAcc.DateTime, this.textEditPredictAcc.DateTime.AddDays(1)); seriesanareal.Points.Clear(); seriesanaperdict.Points.Clear(); seriesreal.Points.Clear(); seriesperdict.Points.Clear(); perdictvalueAcc.Clear(); //真实数据 var realvalue = _pumpRunHelper.GetPumpOutTotalDayAccWaterData(this.textEditPredictAcc.DateTime, this.textEditPredictAcc.DateTime.AddDays(30), out string error); //真实数据 var realHistoryData = _pumpRunHelper.GetPumpOutTotalDayAccWaterData(this.textEditPredictAcc.DateTime.AddDays(-Convert.ToInt32(this.textEditDay.EditValue)), this.textEditPredictAcc.DateTime, out string err); var totalSumByTimePoint = realHistoryData .SelectMany(otdl => otdl.pumpOutWater); for (DateTime currentDate = textEditPredictAcc.DateTime; currentDate <= textEditPredictAcc.DateTime.AddDays(30); currentDate = currentDate.AddDays(1)) { ConstantLine constantLine = new ConstantLine("ConstantLine_" + currentDate.ToString("yyyyMMdd")) { AxisValue = currentDate.AddDays(1), Title = { Text = $"{currentDate.AddDays(1).ToString("dd号")}", Alignment = ConstantLineTitleAlignment.Far, DXFont = new System.Drawing.Font("宋体", 10)}, Color = Color.DeepSkyBlue, LineStyle = { Thickness = 2 }, Visible = true, LegendText = string.Empty, ShowInLegend = false, }; ((XYDiagram)chartControlAna1.Diagram).AxisX.ConstantLines.Add(constantLine); } foreach (var item in totalSumByTimePoint) { perdictvalueAcc.Add(new TotalOneDay() { DateTime = this.textEditPredictAcc.DateTime,Total = item.Total / Convert.ToInt32(this.textEditDay.EditValue) }); } //算法预测数据 #region 方案一平均数 Prj1.Clear(); List realdata = realvalue .SelectMany(item => item.pumpOutWater) .ToList(); if (realdata != null) { foreach (var item in realdata) { seriesreal.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); seriesanareal.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); } } if (perdictvalueAcc != null) { foreach (var item in perdictvalueAcc) { seriesperdict.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); } } if (seriesreal.Points.Count == 0) { seriesreal.ShowInLegend = false; } else seriesreal.ShowInLegend = true; if (seriesperdict.Points.Count == 0) { seriesperdict.ShowInLegend = false; } else seriesperdict.ShowInLegend = true; //this.bindingSourceAna1.DataSource = Prj1; #endregion #region 方案二SSA算法 var anaPerdict = _pumpRunHelper.GetPredictOutTotalAccDayWaterData(this.textEditPredictAcc.DateTime, Convert.ToInt32(textEditDay1.EditValue), 720, out string err1); Prj2.Clear(); if (anaPerdict != null) { foreach (var item in anaPerdict) { seriesanaperdict.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.Total), 2)); } } double AddPerdict = 0; double AddReal = 0; for (int i = 0; i < anaPerdict.Count-1; i++) { if (anaPerdict[i].DateTime.Day == anaPerdict[i + 1].DateTime.Day) { AddPerdict += anaPerdict[i].Total; AddReal += realdata[i].Total; } else { Prj2.Add(new CurrentModel() { Datetime = anaPerdict[i].DateTime.ToString("MM-dd"), RealData = AddReal, PredictData =Math.Round( AddPerdict,0), PercentValue = Convert.ToDecimal(((AddReal- AddPerdict) / AddPerdict) * 100).ToString("0.00") + "%" }); AddPerdict = 0; AddReal = 0; } } if (seriesanaperdict.Points.Count == 0) { seriesanaperdict.ShowInLegend = false; } else seriesanaperdict.ShowInLegend = true; ((LineSeriesView)seriesanaperdict.View).LineStyle.DashStyle = DashStyle.Dash; ((LineSeriesView)seriesperdict.View).LineStyle.DashStyle = DashStyle.Dash; this.bindingSourceAcc2.DataSource = Prj2; #endregion WaitFrmHelper.HideWaitForm(); } } }