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