using DevExpress.Accessibility; using DevExpress.XtraCharts; using DevExpress.XtraGrid.Views.Grid; using IStation.BLL; using IStation.Common; 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当前选择的日期 DateTime HistoryTime = new DateTime(); List _CurrentModel = new List(); PumpRunHelper _PumpRunHelper = new PumpRunHelper(); CalcModel.AnaPrj _Ana = null; //方案数据 Model.RunParasData _LastYeay = null; //去年同期 Model.RunParasData _CurrentData = null; //实际数据 List _HistorypumpWater = new List(); //历史参数日期重构 bool isChage = true; List _CurrentPumpWater = new List(); //实际参数日期重构 /// /// 绑定数据 /// /// public void SetBindingData(DateTime datetime) { /* PumpHistoryDataFileHelper pumpHistoryDataFileHelper = new PumpHistoryDataFileHelper(); pumpHistoryDataFileHelper.GetHistoryData();*/ WaitFrmHelper.ShowWaitForm(); ListDayTime = datetime; if (isChage) { SetTextToCheckBtn(datetime); } if (checkEditCalendar.SelectedIndex == 0) { DateTime = datetime.AddDays(-366); } else //if(checkEditCalendar.SelectedIndex == 1) { DateTime = ConvertDateTime(datetime); } _Ana = IStation.BLL.AnaPrj.GetDefaultPrjByStartDay(datetime); //方案数据 if (HistoryTime > new DateTime(2001, 1, 1)) { _LastYeay = _PumpRunHelper.GetByHistoryOneData(HistoryTime, out string error); } //去年同期 else { _LastYeay = _PumpRunHelper.GetByHistoryOneData(DateTime, out string error); } _CurrentData = _PumpRunHelper.GetPumpRunParasOneDay(DateTime, out string err); //实际数据 MergeCurrentModel(_Ana, _LastYeay, _CurrentData);//girdview合并数据 SetHistoryPumpWaterParas(new DateTime(datetime.Year, datetime.Month, datetime.Day)); //历史取水量 SetCurretnPumpWaterParas(new DateTime(datetime.Year, datetime.Month, datetime.Day)); //实际取水量 GetAnaWater(); SetSeriseEle(); isChage = true; HistoryTime = new DateTime(); 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 bt in _Ana.BlockTimes) { foreach (var item in bt.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) { isChage = false; 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")})"); this.checkEditCalendar.Properties.Items.Add("自定义选择时间"); this.checkEditCalendar.SelectedIndex = 0; } //修改自定义时间 private void EditComBom(DateTime dateTime) { isChage = false; this.checkEditCalendar.Properties.Items.RemoveAt(2); this.checkEditCalendar.Properties.Items.Add($"自定义时间{dateTime}"); HistoryTime = dateTime; SetBindingData(ListDayTime); } //合并所有开始时间-结束时间 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) { // lastYearDay = new DateTime(2024, 4, 8); //lastYearDay = lastYearDay.AddYears(-1); // 创建一个 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); var LunarDate = convert(thisYear - 1, thisMonth, thisDay); // DateTime gregorianDate = chineseCalendar.ToDateTime(thisYear, thisMonth, thisDay, 0, 0, 0, 0); return LunarDate; } //阴历转换阳历 private DateTime convert(int year, int month, int day) { for (DateTime dateTime = new DateTime(year, 1, 1); dateTime < new DateTime(year, month + 3, 1); dateTime = dateTime.AddDays(1)) { ChineseLunisolarCalendar chineseCalendar = new ChineseLunisolarCalendar(); int thisYear = chineseCalendar.GetYear(dateTime); int thisMonth = chineseCalendar.GetMonth(dateTime); int thisDay = chineseCalendar.GetDayOfMonth(dateTime); if (thisYear == year && thisMonth == month && thisDay == day) { return dateTime; } } return new DateTime(2023, 1, 1); } //获取水位数据 /* 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; XYDiagram main_diagramele = chartControlEle.Diagram as XYDiagram; var axisTimeele = main_diagramele.AxisX; axisTimeele.VisualRange.Auto = true; axisTimeele.WholeRange.Auto = true; axisTimeele.WholeRange.SideMarginsValue = 0; axisTimeele.VisualRange.SideMarginsValue = 0; // axisTime.WholeRange.SetMinMaxValues(LastYearTime, LastYearTime.AddDays(1)); // axisTime.VisualRange.SetMinMaxValues(LastYearTime, LastYearTime.AddDays(1)); var CurrentPumpWater = _PumpRunHelper.GetByPumpOneDayWaterData(dateTime, 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; } var allTime = _Ana.GetAllPointTimeList(); foreach (var item in allTime) { 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) { isChage = false; if (this.checkEditCalendar.SelectedIndex == 2) { var dlg = new UserChoiceDateDlg(); dlg.ReloadEvent += EditComBom; dlg.ShowDialog(); } else { 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)); _CurrentModel.Clear(); if (DateTime.Now.Date >= ListDayTime && CurrentDateOpen != null /*&& LastYearIsOpen != null *//*&& anaPrj != null*/) { _CurrentModel.Clear(); foreach (var model in CurrentDateOpen) { var CurrentDate = 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 * 1000, Water = model.Item5 * 1000, //km³---m³ Electricity = model.Item6 * 1000, TimeSpan = (model.Item2 - model.Item1).TotalMinutes, TotalEle = _CurrentData.Electric * 1000, //Mwh--kwh TotalElePrice = _CurrentData.Money * 1000, TotalWater = Math.Round(_CurrentData.FlowIn / 10, 1),//km³ ---万m³ QDSLN = Math.Round(((_CurrentData.Electric * 1000) / (_CurrentData.FlowIn / 10)) / 10, 1) }; _CurrentModel.Add(CurrentDate); } } 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, 2), ElectricityPrice = Math.Round(item.SumMoney, 2), Water = Math.Round(item.SumFlow, 2), TimeSpan = (item.EndTime - item.StartTime).TotalMinutes, TotalEle = Math.Round(_Ana.SumPower4Disp, 2), TotalWater = _Ana.SumFlow4Disp, TotalElePrice = Math.Round(_Ana.SumMoney, 2), QDSLN = _Ana.QDSLN }; _CurrentModel.Add(project); } } if (LastYearIsOpen != 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 * 1000, Water = model.Item5 * 1000, Electricity = model.Item6 * 1000, TimeSpan = (model.Item2 - model.Item1).TotalMinutes, TotalEle = _LastYeay.Electric * 1000, TotalElePrice = _LastYeay.Money * 1000, TotalWater = Math.Round(_LastYeay.FlowIn / 10, 1), QDSLN = Math.Round(((_LastYeay.Electric * 1000) / (_LastYeay.FlowIn / 10)) / 10, 1) }; _CurrentModel.Add(LastYear); } } 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; } } } }