using DevExpress.XtraCharts; using DevExpress.XtraExport.Helpers; using DevExpress.XtraGrid.Views.Grid; using IStation.BLL; using IStation.CalcModel; using IStation.Model; using System; using System.Collections.Generic; using System.Globalization; namespace IStation.WinFrmUI.Monitor { public partial class ResultChartControl : DevExpress.XtraEditors.XtraUserControl { public ResultChartControl() { InitializeComponent(); } private class CurrentModel { /// /// 名称 /// public string Name { get; set; } /// /// 泵台数 /// public string PumpCount { get; set; } /// /// 开机时间段 /// public string Time { get; set; } /// /// 电费 /// public double ElectricityPrice { get; set; } /// /// 用电量 /// public double Electricity { get; set; } /// /// 取水量 /// public double Water { get; set; } /// /// 持续时间 /// public double TimeSpan { get; set; } /// /// 总取水量 /// public double TotalWater { get; set; } /// /// 总电费 /// public double TotalElePrice { get; set; } /// /// 总用电量 /// public double TotalEle { get; set; } /// /// 千吨水能耗 /// public double QDSLN { get; set; } } bool isSetData = false; DateTime DateTime; //api查询需要的日期 DateTime ListDayTime; //listBox当前选择的日期 List _CurrentModel = new List(); PumpRunHelper _PumpRunHelper = new PumpRunHelper(); CalcModel.AnaPrj _Ana = null; //方案数据 Model.RunParasData _LastYeay = null; //去年同期 Model.RunParasData _CurrentData = null; //实际数据 List _HistorypumpWater = new List(); //历史参数日期重构 List _CurrentPumpWater =new List(); //实际参数日期重构 /// /// 绑定数据 /// /// public void SetBindingData(DateTime datetime) { WaitFrmHelper.ShowWaitForm(); ListDayTime = datetime; if (checkEditCalendar.SelectedIndex == 0) { DateTime = datetime.AddDays(-366); } else { DateTime = ConvertDateTime(datetime); } SetTextToCheckBtn(datetime); _Ana = IStation.BLL.AnaPrj.GetPrj(datetime); //方案数据 _LastYeay = _PumpRunHelper.GetByHistoryOneData(DateTime, out string error); //去年同期 _CurrentData = _PumpRunHelper.GetPumpRunParasOneDay(DateTime, out string err); //实际数据 MergeCurrentModel(_Ana, _LastYeay, _CurrentData); //GetTideData(Model.eTideSouce.Book, 2, datetime, new DateTime(datetime.Year, datetime.Month, datetime.Day, 23, 59, 59)); // GetTideData(Model.eTideSouce.Web, 3, datetime, new DateTime(datetime.Year, datetime.Month, datetime.Day, 23, 59, 59)); SetHistoryPumpWaterParas(new DateTime(datetime.Year, datetime.Month, datetime.Day)); //历史取水量 SetCurretnPumpWaterParas(new DateTime(datetime.Year, datetime.Month, datetime.Day)); //实际取水量 GetAnaWater(); SetSeriseEle(); WaitFrmHelper.HideWaitForm(); } private void SetSeriseEle() { var SeriesHistory = this.chartControlEle.Series[1]; var SeriesCurrent = this.chartControlEle.Series[0]; var SeriesAna = this.chartControlEle.Series[2]; SeriesHistory.Points.Clear(); SeriesCurrent.Points.Clear(); SeriesAna.Points.Clear(); if (_HistorypumpWater != null) { foreach (var item in _HistorypumpWater) { SeriesHistory.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.TotalEle), 2)); } } if (_CurrentPumpWater != null) { foreach (var item in _CurrentPumpWater) { SeriesCurrent.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.TotalEle), 2)); } } if (_Ana != null&& isSetData) { foreach (var item in _Ana.PointTimes) { SeriesAna.Points.Add(new SeriesPoint(item.Time, Math.Round(item.SumPower), 2)); } } if (SeriesHistory.Points.Count == 0) { SeriesHistory.ShowInLegend = false; } else SeriesHistory.ShowInLegend = true; if (SeriesCurrent.Points.Count == 0) { SeriesCurrent.ShowInLegend = false; } else SeriesAna.ShowInLegend = true; if (SeriesAna.Points.Count == 0) { SeriesAna.ShowInLegend = false; } else SeriesAna.ShowInLegend = true; } //checkbtn添加item private void SetTextToCheckBtn(DateTime dateTime) { this.checkEditCalendar.Properties.Items.Clear(); this.checkEditCalendar.Properties.Items.Add($"阳历({dateTime.ToString("yyyy-MM-dd")})"); this.checkEditCalendar.Properties.Items.Add($"阴历({ConvertDateTime(dateTime).ToString("yyyy-MM-dd")})"); } //合并所有开始时间-结束时间 private List<(DateTime, DateTime, double, double, double)> MergeList(Model.RunParasData runParasData) { if (runParasData == null) return null; List<(DateTime, DateTime, double, double, double)> values = new List<(DateTime, DateTime, double, double, double)>(); foreach (var item in runParasData.Pump1) { values.Add((item.StartTime, item.EndTime, item.Money, item.FlowIn, item.Electric)); } foreach (var item in runParasData.Pump2) { values.Add((item.StartTime, item.EndTime, item.Money, item.FlowIn, item.Electric)); } foreach (var item in runParasData.Pump3) { values.Add((item.StartTime, item.EndTime, item.Money, item.FlowIn, item.Electric)); } foreach (var item in runParasData.Pump4) { values.Add((item.StartTime, item.EndTime, item.Money, item.FlowIn, item.Electric)); } foreach (var item in runParasData.Pump5) { values.Add((item.StartTime, item.EndTime, item.Money, item.FlowIn, item.Electric)); } return values; } //农历阴历日期转换 private DateTime ConvertDateTime(DateTime lastYearDay) { // 创建一个 ChineseLunisolarCalendar 实例 ChineseLunisolarCalendar chineseCalendar = new ChineseLunisolarCalendar(); int thisYear = chineseCalendar.GetYear(lastYearDay); int thisMonth = chineseCalendar.GetMonth(lastYearDay); int thisDay = chineseCalendar.GetDayOfMonth(lastYearDay); // 将阴历日期减去一年 DateTime lastYearLunarDate = new DateTime(thisYear, thisMonth, thisDay, 0, 0, 0, 0).AddYears(-1); DateTime gregorianDate = chineseCalendar.ToDateTime(lastYearLunarDate.Year, lastYearLunarDate.Month, lastYearLunarDate.Day, 0, 0, 0, 0); return gregorianDate; } //获取水位数据 /* private void GetTideData(Model.eTideSouce eTideSouce, int sort, DateTime Startday, DateTime Endday) { XYDiagram main_diagram = chartControl实时数据.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(Startday, Startday.AddDays(1)); axisTime.VisualRange.SetMinMaxValues(Startday, Startday.AddDays(1)); var tidelist = BLL.TideHelper.GetByDayRange(eTideSouce, Startday, Endday, out string a); var SeriseMonitor = this.chartControl实时数据.Series[sort]; SeriseMonitor.Points.Clear(); if (tidelist != null) { foreach (var item in tidelist) { SeriseMonitor.Points.Add(new SeriesPoint(item.Time, item.Level)); } } if (SeriseMonitor.Points.Count == 0) { SeriseMonitor.ShowInLegend = false; } else SeriseMonitor.ShowInLegend = true; }*/ //添加历史取水量 private void SetHistoryPumpWaterParas(DateTime dateTime) { _HistorypumpWater.Clear(); var LastYearTime = dateTime.AddDays(-366); XYDiagram main_diagram = chartControl实时数据.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(LastYearTime, LastYearTime.AddDays(1)); // axisTime.VisualRange.SetMinMaxValues(LastYearTime, LastYearTime.AddDays(1)); var waterParas = _PumpRunHelper.GetByPumpOneDayWaterData(LastYearTime, out string error); if (waterParas == null) return; foreach (var item in waterParas) { _HistorypumpWater.Add(new PumpWater { DateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, item.DateTime.Hour, item.DateTime.Minute, 0), TotalWater = item.TotalWater, TotalEle = item.TotalEle }); } var SeriseMonitor = this.chartControl实时数据.Series[1]; SeriseMonitor.Points.Clear(); if (_HistorypumpWater != null) { foreach (var item in _HistorypumpWater) { SeriseMonitor.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.TotalWater), 2)); } } if (SeriseMonitor.Points.Count == 0) { SeriseMonitor.ShowInLegend = false; } else SeriseMonitor.ShowInLegend = true; } //添加实际取水量 private void SetCurretnPumpWaterParas(DateTime dateTime) { // List pumpWater = new List(); XYDiagram main_diagram = chartControl实时数据.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(LastYearTime, LastYearTime.AddDays(1)); // axisTime.VisualRange.SetMinMaxValues(LastYearTime, LastYearTime.AddDays(1)); var CurrentPumpWater = _PumpRunHelper.GetByPumpOneDayWaterData(dateTime.AddMonths(-6), out string error); var SeriseMonitor = this.chartControl实时数据.Series[0]; if (CurrentPumpWater == null) return; _CurrentPumpWater.Clear(); foreach (var item in CurrentPumpWater) { _CurrentPumpWater.Add(new PumpWater { DateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, item.DateTime.Hour, item.DateTime.Minute, 0), TotalWater = item.TotalWater, TotalEle = item.TotalEle }); } SeriseMonitor.Points.Clear(); if (_CurrentPumpWater != null) { foreach (var item in _CurrentPumpWater) { SeriseMonitor.Points.Add(new SeriesPoint(item.DateTime, Math.Round(item.TotalWater), 2)); } } if (SeriseMonitor.Points.Count == 0) { SeriseMonitor.ShowInLegend = false; } else SeriseMonitor.ShowInLegend = true; } //添加方案取水量 private void GetAnaWater() { XYDiagram main_diagram = chartControl实时数据.Diagram as XYDiagram; var axisTime = main_diagram.AxisX; axisTime.VisualRange.Auto = true; axisTime.WholeRange.Auto = true; axisTime.WholeRange.SideMarginsValue = 0; axisTime.VisualRange.SideMarginsValue = 0; var SeriseMonitor = this.chartControl实时数据.Series[2]; SeriseMonitor.Points.Clear(); if (_Ana == null || !isSetData) { SeriseMonitor.ShowInLegend = false; return; } foreach (var item in _Ana.PointTimes) { SeriseMonitor.Points.Add(new SeriesPoint(item.Time, item.RealFlow)); } SeriseMonitor.ShowInLegend = true; } //比较 private void barBtnCompare_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var dlg = new HistoryDlg(); dlg.SetBindingData(_Ana); dlg.ShowDialog(); } //日历check选择变换事件 private void checkEditCalendar_SelectedIndexChanged(object sender, EventArgs e) { this.SetBindingData(ListDayTime); } //显示方案数据 private void barCheckData_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { isSetData = this.barCheckData.Checked; var a = new CalcModel.AnaPrj(); GetAnaWater(); SetSeriseEle(); MergeCurrentModel(a, _LastYeay, _CurrentData); if (this.barCheckData.Checked) { this.barCheckData.Caption = "隐藏方案数据"; } else this.barCheckData.Caption = "显示方案数据"; } //页面类合并 private void MergeCurrentModel(CalcModel.AnaPrj anaPrj, Model.RunParasData LastYeay, RunParasData currentData) { HistoryDataAPiHelper historyDataAPiHelper = new HistoryDataAPiHelper(); var LastYearIsOpen = historyDataAPiHelper.MergeTimeSlots(MergeList(LastYeay)); var CurrentDateOpen = historyDataAPiHelper.MergeTimeSlots(MergeList(currentData)); if (DateTime.Now.Date > ListDayTime && CurrentDateOpen != null && LastYearIsOpen != null && anaPrj != null) { _CurrentModel.Clear(); foreach (var model in CurrentDateOpen) { var CurrentDate = new CurrentModel { Name = "实际" + ListDayTime.ToString("(yyyy-MM-dd)"), PumpCount = string.Format("{0}台泵", model.Item3.ToString()), Time = model.Item1.ToString("HH:mm") + "-" + model.Item2.ToString("HH:mm"), ElectricityPrice = model.Item4, Water = model.Item5, Electricity = model.Item6, TimeSpan = (model.Item2 - model.Item1).TotalMinutes, TotalEle = _CurrentData.Electric, TotalElePrice = _CurrentData.Money, TotalWater = _CurrentData.FlowIn, QDSLN = Math.Round(model.Item6 * 1000 / model.Item5, 1) }; _CurrentModel.Add(CurrentDate); } } if (LastYearIsOpen != null && _Ana != null) { foreach (var model in LastYearIsOpen) { var LastYear = new CurrentModel { Name = "去年同期" + model.Item1.ToString("(yyyy-MM-dd)"), PumpCount = string.Format("{0}台泵", model.Item3.ToString()), Time = model.Item1.ToString("HH:mm") + "-" + model.Item2.ToString("HH:mm"), ElectricityPrice = model.Item4, Water = model.Item5, Electricity = model.Item6, TimeSpan = (model.Item2 - model.Item1).TotalMinutes, TotalEle = _LastYeay.Electric, TotalElePrice = _LastYeay.Money, TotalWater = _LastYeay.FlowIn, QDSLN = Math.Round(model.Item6 * 1000 / model.Item5, 1) }; _CurrentModel.Add(LastYear); } } if (_Ana != null && isSetData) { foreach (var item in _Ana.BlockTimes) { if (item.OpenPumpCount == 0) { continue; } var project = new CurrentModel { Name = "方案" + item.StartTime.ToString("(yyyy-MM-dd)"), PumpCount = string.Format("{0}台泵", item.OpenPumpCount), Time = item.StartTime.ToString("HH:mm") + "-" + item.EndTime.ToString("HH:mm"), Electricity = Math.Round(item.SumPower / 1000, 2), ElectricityPrice = Math.Round(item.SumMoney / 1000, 2), Water = Math.Round(item.SumFlow, 2), TimeSpan = (item.EndTime - item.StartTime).TotalMinutes, TotalEle = Math.Round(_Ana.SumPower4Disp / 1000, 2), TotalWater = _Ana.SumFlow4Disp, TotalElePrice = Math.Round(_Ana.SumMoney / 1000, 2), QDSLN = _Ana.QDSLN }; _CurrentModel.Add(project); } } this.bindingSource1.DataSource = _CurrentModel; this.bindingSource1.ResetBindings(false); } //自定义合并 private void gridView2_CellMerge(object sender, CellMergeEventArgs e) { var gridViewPumpID1 = gridView2.GetRow(e.RowHandle1) as CurrentModel; var gridViewPumpID2 = gridView2.GetRow(e.RowHandle2) as CurrentModel; if (gridViewPumpID1 == gridViewPumpID2) { return; } if (gridViewPumpID1.Name != gridViewPumpID2.Name) { e.Merge = false; e.Handled = true; } } } }