using DevExpress.XtraCharts; using System.Data; using Yw.WinFrmUI; using Yw; namespace IBox.WinFrmUI { public partial class IBoxFormScheme : DocumentPage { private string startCode = "[&start&]"; private string endCode = "[&end&]"; private string paramCode = "[¶m&]"; private string getcalvalueCode = "getcalvalue"; private string cleardataCode = "cleardata"; public IBoxFormScheme(SimuViewModel simuCalcViewModel) { _currentBuild = simuCalcViewModel.CurrentBuild; _facilities = simuCalcViewModel.Facilities; this.PageTitle.Caption = "调度方案"; InitializeComponent(); //InitialChart(); InitialDataSource(); //this.chartControl.CrosshairEnabled = DefaultBoolean.True; //this.chartControl.RuntimeHitTesting = true; //this.chartControl.MouseDown += this.chartControl_MouseDown; //this.chartControl.AnimationStartMode = ChartAnimationMode.OnLoad; this.gridView1.SetNormalView(); this.gridView3.SetNormalView(); this.gridView3.OptionsDetail.EnableMasterViewMode = false; this.gridView1.OptionsView.ShowIndicator = false; } private List> _pumpCombine = null;//泵调度组合 public event EventHandler SendData; private List _simuPumps = null;//调度泵列表 private Model.Facilities _facilities = null;//设施 private double _sysMaxQ, _constantP;//系统最大流量/恒压值 private Build _currentBuild = null;//当前建筑物 #region Chart Variable private XYDiagram _xyDiagram = null; private GanttDiagram _ganttDiagram = null; private XYDiagramPane _paneP, _panePE, _paneRun; private AxisX _axisX; private AxisY _axisYP; private SecondaryAxisY _axisYQ, _axisYPower, _axisYE, _axisYRun; private void r_Click(object sender, EventArgs e) { } private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { barButtonItem1.Enabled = false; //barBtnCalc.Enabled = true; } private void barBtnCalc_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { barButtonItem1.Enabled = true; //barBtnCalc.Enabled = false; } private void EboxFormScheme_Load(object sender, EventArgs e) { this.barEditItemStartDate.EditValue = DateTime.Now.ToString("yyyy-MM-dd"); this.barEditItemEnd.EditValue = DateTime.Now.ToString("yyyy-MM-dd"); var m = new GetCalcValueModel() { StartDate = DateTime.Parse(this.barEditItemStartDate.EditValue.ToString()), EndDate = DateTime.Parse(this.barEditItemEnd.EditValue.ToString()), }; Thread.Sleep(500); SendText(startCode + getcalvalueCode + paramCode + JsonHelper.Object2Json(m) + endCode); } private void barButtonItem1_ItemClick_1(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var m = new GetCalcValueModel() { StartDate = DateTime.Parse(barEditItemStartDate.EditValue.ToString()), EndDate = DateTime.Parse(barEditItemEnd.EditValue.ToString()), }; SendText(startCode + getcalvalueCode + paramCode + JsonHelper.Object2Json(m) + endCode); } private void SendText(string content) { WaitFrmHelper.ShowWaitForm(); //BluetoothHelper.GetInstance().SendData(content); SendData?.Invoke(null, content); } private ConstantLine _lineTime, _lineP, _ganttLine; private Series _seriesUsageQ, _seriesRangeAreaQ, _seriesRangeArea, _seriesAvgP, _seriesCalcP, _seriesRealP, _seriesPower, _seriesE; private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SendText(startCode + cleardataCode + paramCode + endCode); Thread.Sleep(100); var m = new GetCalcValueModel() { StartDate = DateTime.Parse(this.barEditItemStartDate.EditValue.ToString()), EndDate = DateTime.Parse(this.barEditItemEnd.EditValue.ToString()), }; SendText(startCode + getcalvalueCode + paramCode + JsonHelper.Object2Json(m) + endCode); } private void barEditItemStartDate_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { } private void gridView3_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.Column.FieldName == "ControlType") { var celValue = e.Value.ToString(); var celNewValue = "设定压力"; switch (celValue) { case "2": celNewValue = "开泵方案"; break; } e.DisplayText = celNewValue; } } private void gridView3_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { var cv = this.gridView3.GetFocusedRow() as CalcValueViewModel; //var cv = SimuCalc(v.TargetFlow, v.TargetHead, double.Parse(_facilities.ConstantP.ToString()), _facilities.WaterPressure, v.Time); if (cv != null) { SetCurveChart(cv.TotalFlow, cv.TargetHead, cv.TotalPower, cv.TotalEff, cv.Pumps); SetPanelInfo(cv); SetRealDataView(cv); } } private void SetRealDataView(CalcValueViewModel calcValueViewModel) { var dataList = new List(); if (!string.IsNullOrEmpty(calcValueViewModel.RealDataJson)) { var realList = JsonHelper.Json2Object>(calcValueViewModel.RealDataJson); foreach (var item in _stations) { foreach (var ml in item.MonitorList) { var dt = realList.FirstOrDefault(x => x.SignalID == ml.SignalID); dataList.Add(new DataGridMonitorViewModel() { DataTime = dt == null ? "-" : dt.DataTime.ToString("yyyy-MM-dd HH:mm:ss"), DataValue = dt == null ? "-" : dt.DataValue, GroupID = item.ID, GroupName = item.Name, MonitorName = ml.Name, SignalID = ml.SignalID, UnitName = ml.UnitName, DataStatus = ml.DataStatus, }); } } } dataGridMonitorViewModelBindingSource.DataSource = dataList; this.gridView2.RefreshData(); } private bool InterValueBuild(Build build, DateTime dt, out double usageQ, out double avgP) { usageQ = avgP = 0; var timeOA = DateTime.Parse("1900-1-1").Add(dt.TimeOfDay).ToOADate(); for (int i = 0; i < build.用水趋势曲线.Data.Count - 1; i++) { if (build.用水趋势曲线.Data[i].X <= timeOA && timeOA <= build.用水趋势曲线.Data[i + 1].X)//找到 { usageQ = (float)(build.用水趋势曲线.Data[i].Y + (build.用水趋势曲线.Data[i + 1].Y - build.用水趋势曲线.Data[i].Y) * (timeOA - build.用水趋势曲线.Data[i].X) / (build.用水趋势曲线.Data[i + 1].X - build.用水趋势曲线.Data[i].X)); break; } } if (usageQ <= 0) { return false; } //maxP = build.流量压降上限.Evaluate(usageQ); //minP = build.流量压降下限.Evaluate(usageQ); avgP = build.流量压降曲线.Evaluate(usageQ); return true; } private CalcValueViewModel SimuCalc (double flow, double press, double constantP, double endP, DateTime dateTime) { _pumpCombine = new List>(); var viewModel = _facilities; if (viewModel != null) { _simuPumps = new List(); if (!long.TryParse(_facilities.CompletePlant, out long kitId)) return null; var kit = new BLL.Kit().GetByID(kitId); if (kit == null) return null; if (kit.UseCount < 1) return null; var equipmentList = new BLL.Equipment().GetByKitIDAndCatalog(kitId, ISupply.Equipment.Pump); if (equipmentList == null || !equipmentList.Any()) return null; if (kit.UseCount > equipmentList.Count) return null; var useList = equipmentList.Take(kit.UseCount); var bllEChartMapping = new BLL.EquipmentEChartMapping(); var bllEChart = new BLL.EChart(); foreach (var item in useList) { var mapping = bllEChartMapping.GetWorkingByEquipmentID(item.ID); if (mapping == null) continue; var chart = bllEChartMapping.GetExByID(mapping.ID); if (chart == null) continue; var curveInfo = chart.CurveInfo; var pump = Model.Pump.ToModel(item.RatedParas); var simuPumpVm = new SimuPumpViewModel(); simuPumpVm.ID = item.ID; simuPumpVm.Name = item.Name; simuPumpVm.Code = item.Name; simuPumpVm.Qr = pump.Qr; simuPumpVm.Hr = pump.Hr; simuPumpVm.Nr = pump.Nr; simuPumpVm.Pr = pump.Pr; simuPumpVm.Er = pump.Er; simuPumpVm.Ic = pump.Ic; simuPumpVm.Oc = pump.Oc; simuPumpVm.IOd = pump.IOd; simuPumpVm.Ie = pump.Ie; simuPumpVm.Oe = pump.Oe; simuPumpVm.IsBp = pump.IsBp; simuPumpVm.IsSxp = pump.IsSxp; simuPumpVm.CurveQH = curveInfo.CurveQH; simuPumpVm.CurveQE = curveInfo.CurveQE; simuPumpVm.CurveQP = curveInfo.CurveQP; _simuPumps.Add(simuPumpVm); } var pumps = _simuPumps.Select(x => x.Name + x.ID).ToList(); _pumpCombine = new List>() { pumps }; } var complexRequestPras = new RequestParasComplex() { StationID = 1, PressValueType = RequestParasComplex.ePressValueType.扬程, SchemeSortType = eAnaSchemeSortType.功率, InletPipePara = new List() { new InletPipePara(0) } }; var calcValues = new List(); complexRequestPras.OutletPipePara = new List(); complexRequestPras.OutletPipePara.Add(new OutletPipePara() { TargetFlow = flow, TargetPress = press }); var calcHelper = new Calculator_OptAna_General(); //if (currentTime.Hour >= 12 && currentTime.Hour % 12 == 0) // combinIndex = 1; var combin = _pumpCombine[0]; var combinRunStatus = new MachineRunPara(); combinRunStatus.MachineRunFilter = new List(); for (int j = 0; j < _simuPumps.Count; j++) { var pump = _simuPumps[j]; //var runStatus = combin.Exists(x => x == pump.Name) ? 1 : 0; var machineRunFilter = new MachineRunFilter() { MachineID = pump.ID, RunStatus = 1, Percentage = 1, IsFrequency = true }; combinRunStatus.MachineRunFilter.Add(machineRunFilter); //combinRunStatus.RunPumpCount = 2; } double energy_calc = 0; double carbon_emission = 0; var calcValue = new CalcValueViewModel(); //calcValue.Time = currentTime; calcValue.TargetFlow = flow; calcValue.TargetHead = press; calcValue.Time = dateTime; calcValues.Add(calcValue); //调度 var schemes = calcHelper.CalcSchemes(_simuPumps, complexRequestPras, null, combinRunStatus, out string errorInfo); if (schemes == null || !schemes.Any()) { calcValue.CalcSuccess = false; return calcValue; //continue; } var scheme = schemes[0]; calcValue.CalcSuccess = true; calcValue.TotalPower = scheme.TotalWrkP; calcValue.TotalEff = scheme.TotalWrkE; calcValue.TotalHead = scheme.TotalWrkH; calcValue.TotalFlow = scheme.TotalWrkQ; calcValue.CalcHead = scheme.TotalWrkH - press + endP; if (scheme.Items != null && scheme.Items.Any()) { calcValue.Pumps = new List(); foreach (var item in scheme.Items) { var pump = new PumpViewModel(); pump.ID = item.PumpID; pump.Name = item.MachineName; pump.HZ = item.Frequence; pump.Power = item.WorkPointP; pump.Eff = item.WorkPointE; pump.Head = item.WorkPointH; pump.Flow = item.WorkPointQ; pump.CurveInfoQH = item.CurveInfoQH; pump.CurveInfoQP = item.CurveInfoQP; calcValue.Pumps.Add(pump); } } return calcValue; } private void gridView3_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if (e.Column.FieldName == "Status") { var celValue = e.CellValue.ToString(); switch (celValue) { case "失败": e.Appearance.ForeColor = Color.Blue; break; default: e.Appearance.ForeColor = Color.Green; break; } } } #endregion private List _stations; /// /// 处理实时数据 /// /// public void BindData(List records, List stations, bool isBlue = true) { _stations = stations; if (isBlue) { this.Invoke(new Action(() => { this.calcValueViewModelBindingSource.DataSource = null; this.gridView3.RefreshData(); var ls = new List(); foreach (var item in records) { if (!string.IsNullOrEmpty(item.JsonBody)) { var m = JsonHelper.Json2Object(item.JsonBody); m.RealDataJson = item.RealDataJson; ls.Add(m); } } _calcValues = ls; this.calcValueViewModelBindingSource.DataSource = _calcValues; this.gridView3.RefreshData(); //var list = records.Select(c => c.JsonBody); //if (list.Any()) //{ // var str = string.Join(",", list); // str = "[" + str + "]"; // _calcValues = JsonHelper.Json2Object>(str); // this.calcValueViewModelBindingSource.DataSource = _calcValues; // this.gridView3.RefreshData(); //if (_calcValues.Any()) //{ // var _takeIndex = 0; // _calcValues.ForEach(c => // { // var calcValue = c; // if (calcValue.CalcSuccess) // { // CalcValueViewModel lastCalcValue = null; // if (_takeIndex > 0) // { // lastCalcValue = _calcValues[_takeIndex - 1]; // } // var time = calcValue.Time; // var power = calcValue.TotalPower; // var eff = calcValue.TotalEff; // var calcP = calcValue.CalcHead; // var avgP = calcValue.TargetHead; // this.chartControl.BeginInit(); // _seriesRangeArea.Points.Add(new SeriesPoint(time, new double[] { avgP, double.Parse(_facilities.ConstantP.ToString()) })); // _seriesAvgP.Points.Add(new SeriesPoint(time, avgP)); // _seriesCalcP.Points.Add(new SeriesPoint(time, calcP)); // _seriesPower.Points.Add(new SeriesPoint(time, power)); // _seriesE.Points.Add(new SeriesPoint(time, eff)); // for (int i = 1; i < _simuPumps.Count + 1; i++) // { // var pump = _simuPumps[i - 1]; // var series = this.chartControl.GetSeriesByName(pump.ID.ToString()); // if (series == null) // continue; // var run = calcValue.Pumps.Exists(x => x.ID == pump.ID); // if (!run && lastCalcValue != null && lastCalcValue.Pumps != null) // { // run = lastCalcValue.Pumps.Exists(x => x.ID == pump.ID); // } // var seriesPoint = new SeriesPoint(time, i); // seriesPoint.IsEmpty = !run; // seriesPoint.Color = !run ? Color.Gray : Color.RoyalBlue; // series.Points.Add(seriesPoint); // } // _lineTime.AxisValue = time.ToString("yyyy-MM-dd HH:mm:ss"); // _lineTime.Title.Text = time.ToString("yyyy-MM-dd HH:mm:ss"); // this.chartControl.EndInit(); // SetPanelInfo(calcValue); // SetCurveChart(calcValue.TotalFlow, calcValue.TargetHead, calcValue.TotalPower, calcValue.TotalEff, calcValue.Pumps); // SetEnergyInfo(calcValue); // } // _takeIndex++; // }); //} //} })); } else { this.calcValueViewModelBindingSource.DataSource = null; this.gridView3.RefreshData(); //var list = records.Select(c => c.JsonBody); //if (list.Any()) //{ // var str = string.Join(",", list); // str = "[" + str + "]"; // _calcValues = JsonHelper.Json2Object>(str); // //_calcValues = records; // this.calcValueViewModelBindingSource.DataSource = _calcValues; // this.gridView3.RefreshData(); //} var ls = new List(); foreach (var item in records) { if (!string.IsNullOrEmpty(item.JsonBody)) { var m = JsonHelper.Json2Object(item.JsonBody); m.RealDataJson = item.RealDataJson; m.ControlType= item.ControlType; ls.Add(m); } } _calcValues = ls; this.calcValueViewModelBindingSource.DataSource = _calcValues; this.gridView3.RefreshData(); } WaitFrmHelper.HideWaitForm(); } /// /// 初始化数据 /// public void InitialDataSource() { //_lineP.AxisValue =_facilities.ConstantP; if (_facilities == null) return; _simuPumps = new List(); if (!long.TryParse(_facilities.CompletePlant, out long kitId)) return; var kit = new BLL.Kit().GetByID(kitId); if (kit == null) return; if (kit.UseCount < 1) return; var equipmentList = new BLL.Equipment().GetByKitIDAndCatalog(kitId, ISupply.Equipment.Pump); if (equipmentList == null || !equipmentList.Any()) return; if (kit.UseCount > equipmentList.Count) return; var useList = equipmentList.Take(kit.UseCount); var bllEChartMapping = new BLL.EquipmentEChartMapping(); var bllEChart = new BLL.EChart(); foreach (var item in useList) { var mapping = bllEChartMapping.GetWorkingByEquipmentID(item.ID); if (mapping == null) continue; var chart = bllEChartMapping.GetExByID(mapping.ID); if (chart == null) continue; var curveInfo = chart.CurveInfo; var pump = Model.Pump.ToModel(item.RatedParas); var simuPumpVm = new SimuPumpViewModel(); simuPumpVm.ID = item.ID; simuPumpVm.Name = item.Name; simuPumpVm.Code = item.NO; simuPumpVm.Qr = pump.Qr; simuPumpVm.Hr = pump.Hr; simuPumpVm.Nr = pump.Nr; simuPumpVm.Pr = pump.Pr; simuPumpVm.Er = pump.Er; simuPumpVm.Ic = pump.Ic; simuPumpVm.Oc = pump.Oc; simuPumpVm.IOd = pump.IOd; simuPumpVm.Ie = pump.Ie; simuPumpVm.Oe = pump.Oe; simuPumpVm.IsBp = pump.IsBp; simuPumpVm.IsSxp = pump.IsSxp; simuPumpVm.CurveQH = curveInfo.CurveQH; simuPumpVm.CurveQE = curveInfo.CurveQE; simuPumpVm.CurveQP = curveInfo.CurveQP; _simuPumps.Add(simuPumpVm); } if (!_simuPumps.Any()) return; //InitialPumpRunSeries(_simuPumps); var pumps = _simuPumps.Select(x => x.Name + x.ID).ToList(); _pumpCombine = new List>() { pumps }; } /// /// 初始化图表 /// #region SetView private List ColorArray = new List() { Color.Red, Color.Blue, Color.Green, Color.DodgerBlue, Color.Fuchsia,Color.MidnightBlue,Color.Maroon, Color.Aquamarine, Color.Bisque ,Color.BurlyWood }; /// /// 设置图表信息 /// public void SetCurveChart(double workQ, double workH, double workP, double workE, List currentPumps) { this.multiCurveExpressChart1.DeleteCurve(); if (currentPumps == null || !currentPumps.Any()) return; if (currentPumps.Count == 1) { var currentPump = currentPumps[0]; ISupply.Curve.CurveExpress QH = currentPump.CurveInfoQH, QP = currentPump.CurveInfoQP; var QE = Curve.PumpCalculateHelper.CalculateE(QH, QP); this.multiCurveExpressChart1.AddCurve(-1, currentPump.Name, currentPump.Flow, currentPump.Head, currentPump.Power, currentPump.Eff, currentPump.HZ, QH, QE, QP, System.Drawing.Color.Black); this.multiCurveExpressChart1.CalcWorkPointByQ(workQ); return; } var theConnectCurve = new Curve.ParallelConnectionHelper(); for (int i = 0; i < currentPumps.Count; i++) { var currentPump = currentPumps[i]; var QH = currentPump.CurveInfoQH; var QP = currentPump.CurveInfoQP; var QE = Curve.PumpCalculateHelper.CalculateE(QH, QP); theConnectCurve.AddCurve(QH, QP); this.multiCurveExpressChart1.AddCurve(currentPump.ID, currentPump.Name, currentPump.Flow, currentPump.Head, currentPump.Power, currentPump.Eff, currentPump.HZ, QH, QE, QP, ColorArray[i]); } var bol = theConnectCurve.CalculateParallel(out List ConnectCurveQH, out List ConnectCurveQE, out List ConnectCurveQP); if (!bol) { return; } var curveExpressQH = ISupply.Curve.FitHelper.BuildCurveExpress(ConnectCurveQH); var curveExpressQE = ISupply.Curve.FitHelper.BuildCurveExpress(ConnectCurveQE); var curveExpressQP = ISupply.Curve.FitHelper.BuildCurveExpress(ConnectCurveQP); this.multiCurveExpressChart1.AddCurve(-1, "并联曲线", workQ, workH, workP, workE, null, curveExpressQH, curveExpressQE, curveExpressQP, System.Drawing.Color.Black); // this.multiCurveExpressChart1.LineVisible = true; this.multiCurveExpressChart1.CalcWorkPointByQ(workQ); } /// /// 设置面板信息 /// private void SetPanelInfo(CalcValueViewModel calcValue) { this.gridControl1.DataSource = calcValue.Pumps; this.gridControl1.RefreshDataSource(); this.txtTime.EditValue = calcValue.Time.ToString("T"); this.txtPower.EditValue = Math.Round(calcValue.TotalPower, 2); this.txtPumpP.EditValue = Math.Round(calcValue.TotalHead, 2); this.txtTerminalP.EditValue = Math.Round(calcValue.CalcHead, 2); } private void SetEnergyInfo(CalcValueViewModel calcValue) { //this.txtTotalEnergy.EditValue = calcValue.TotalEnergy; //this.txtEnergyEfficient.EditValue = calcValue.EnergyEfficient; //this.txtCarbonEmission.EditValue = Math.Round(calcValue.CarbonEmission, 4); //this.txtEnergyEfficiencyRatio.EditValue = calcValue.EnergyEfficiencyRatio; } private List _calcValues = null;//计算值 //图表 鼠标点击事件 private void chartControl_MouseDown(object sender, MouseEventArgs e) { ////return; //if (e.Button != MouseButtons.Left) // return; //var hitInfo = this.chartControl.CalcHitInfo(e.Location); //if (hitInfo.InChart) //{ // var diagramCoordinates = _xyDiagram.PointToDiagram(e.Location); // var axisValue = diagramCoordinates.GetAxisValue(_axisX); // if (axisValue == null) // return; // var dt = axisValue.DateTimeValue; // //if (dt > (DateTime)_lineTime.AxisValue) // // return; // var cv = _calcValues?.Find(x => x.Time == dt); // //if (cv == null) // //{ // // var bol = InterValueBuild(_currentBuild, dt, out double targetFlow, out double targetHead); // // if (!bol) // // return; // // cv = SimuCalc(dt, _simuPumps, targetFlow, targetHead, _constantP); // // if (cv == null) // // return; // //} // SetCurveChart(cv.TotalFlow, cv.TargetHead, cv.TotalPower, cv.TotalEff, cv.Pumps); // SetPanelInfo(cv); //} } #endregion } }