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