using DevExpress.XtraCharts;
|
using DevExpress.XtraEditors;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel.DataAnnotations;
|
using System.Drawing;
|
using System.Linq;
|
using System.Text;
|
|
namespace IStation.WinFrmUI.Monitor
|
{
|
public partial class DataCorrectionPage : DocumentPage
|
{
|
public DataCorrectionPage()
|
{
|
InitializeComponent();
|
PageTitle.Caption = "数据修正";
|
|
gridView1.SetNormalView();
|
gridView2.SetNormalView();
|
|
colYear.Visible = false;
|
colMonth.Visible = false;
|
colHzRound.Visible = false;
|
colPower.Visible = false;
|
colWaterLevel.Visible = false;
|
colInletPressure.Visible = false;
|
|
colTime.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
|
colTime.DisplayFormat.FormatString = "G";
|
|
|
repositoryItemDateEdit1.SetOnlyShowYearMonth();
|
repositoryItemDateEdit2.SetOnlyShowYearMonth();
|
barEditDateStart.EditValue = new DateTime(2024, 1, 1);
|
barEditDateEnd.EditValue = new DateTime(2024, 9, 1);
|
|
cmbFlag.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;
|
|
stationListCtrl1.FocusedChangedEvent += StationListCtrl1_FocusedChangedEvent;
|
monitorDataSourcesTreeList1.FocusedChangedEvent += MonitorDataSourcesListCtrl1_FocusedChangedEvent;
|
|
InitialDiagarm();
|
}
|
|
|
private SwiftPlotDiagram _diagram;//图表
|
private Series _series_default_head; //
|
private Series _series_curve_head; //
|
private Series _series_correct_curve_head; //
|
private Series _series_head_diff; //
|
private Series _series_hz; //
|
|
private void InitialDiagarm()
|
{
|
chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;//是否在图表上显示图例
|
chartControl1.CrosshairOptions.ShowOnlyInFocusedPane = false;
|
// Access the diagram's properties.把 Diagram 对象转换为所需的图象类型
|
_diagram = (SwiftPlotDiagram)chartControl1.Diagram;
|
_diagram.EnableAxisXScrolling = true;//X轴是否允许滚动
|
_diagram.EnableAxisXZooming = true;//X轴是否允许缩放
|
_diagram.PaneLayout.Direction = PaneLayoutDirection.Vertical;//窗格的对齐方式
|
|
_diagram.AxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Minute;
|
|
|
_series_default_head = chartControl1.GetSeriesByName("SeriesDefaultHead");
|
_series_curve_head = chartControl1.GetSeriesByName("SeriesCurveHead");
|
_series_correct_curve_head = chartControl1.GetSeriesByName("SeriesCorrectCurveHead");
|
_series_head_diff = chartControl1.GetSeriesByName("SeriesHeadDiff");
|
_series_hz = chartControl1.GetSeriesByName("SeriesHz");
|
|
_series_default_head.CrosshairLabelPattern = "原始值:{V}";
|
_series_curve_head.CrosshairLabelPattern = "曲线值:{V}";
|
_series_correct_curve_head.CrosshairLabelPattern = "修正值:{V}";
|
_series_head_diff.CrosshairLabelPattern = "偏差值:{V}";
|
_series_hz.CrosshairLabelPattern = "频率:{V}";
|
|
|
//定制窗格的滚动条的外观
|
ScrollBarOptions scrollBarOptions = _diagram.DefaultPane.ScrollBarOptions;
|
scrollBarOptions.BackColor = Color.White;
|
scrollBarOptions.BarColor = Color.LightSlateGray;
|
scrollBarOptions.BorderColor = Color.DarkGray;
|
scrollBarOptions.BarThickness = 15;
|
scrollBarOptions.XAxisScrollBarAlignment = ScrollBarAlignment.Far;
|
scrollBarOptions.XAxisScrollBarVisible = true;
|
|
}
|
|
|
#region ViewModel
|
|
public class PumpViewModel
|
{
|
[Display(Name = "年")]
|
public int Year { get; set; }
|
|
[Display(Name = "月")]
|
public int Month { get; set; }
|
|
[Display(Name = "时间")]
|
public string Time { get; set; }
|
|
[Display(Name = "泵")]
|
public int Flag { get; set; }
|
|
[Display(Name = "转速")]
|
public double Rpm { get; set; }
|
|
[Display(Name = "频率")]
|
public double Hz { get; set; }
|
|
[Display(Name = "频率")]
|
public double Hz0 { get; set; }
|
|
[Display(Name = "水位")]
|
public double WaterLevel { get; set; }
|
|
[Display(Name = "进口压力")]
|
public double InletPressure { get; set; }
|
|
[Display(Name = "出口压力")]
|
public double OutletPressure { get; set; }
|
|
[Display(Name = "压差")]
|
public double PressureDiff { get; set; }
|
|
[Display(Name = "瞬时流量")]
|
public double Flow { get; set; }
|
|
[Display(Name = "扬程")]
|
public double Head { get; set; }
|
|
[Display(Name = "瞬时功率")]
|
public double Power { get; set; }
|
|
|
[Display(Name = "曲线扬程")]
|
public double CurveHead { get; set; }
|
|
[Display(Name = "扬程差值")]
|
public double HeadDiff { get; set; }
|
|
[Display(Name = "修正曲线扬程")]
|
public double CorrectCurveHead { get; set; }
|
|
[Display(Name = "修正扬程差值")]
|
public double CorrectHeadDiff { get; set; }
|
|
|
[Display(Name = "修正压差")]
|
public double CorrectPressureDiff { get; set; }
|
|
[Display(Name = "修正压差差值")]
|
public double CorrectPressureDiffDiff { get; set; }
|
|
}
|
|
public class PumpFactorViewModel
|
{
|
[Display(Name = "泵")]
|
public int Flag { get; set; }
|
|
[Display(Name = "频率")]
|
public double Hz { get; set; }
|
|
[Display(Name = "总体标准差")]
|
public double? STDP { get; set; }
|
|
[Display(Name = "扬程(STDP)")]
|
public double? STDPHead { get; set; }
|
|
|
[Display(Name = "备注")]
|
public string Note { get; set; }
|
|
public void Round()
|
{
|
if (STDP.HasValue)
|
{
|
STDP = Math.Round(STDP.Value, 5);
|
}
|
if (STDPHead.HasValue)
|
{
|
STDPHead = Math.Round(STDPHead.Value, 5);
|
}
|
|
}
|
}
|
#endregion
|
|
private BLL.StationSignalRecordPacket _bll = new BLL.StationSignalRecordPacket();
|
private Model.Station _station = null;
|
private Model.MonitorDataSources _monitorDataSources = null;
|
|
private List<PumpViewModel> _pump_vm_list = null;
|
private List<Model.Equipment<Model.Pump>> _pump_list = null;
|
|
/// <summary>
|
/// 清空数据
|
/// </summary>
|
public void Clear()
|
{
|
_pump_vm_list = new List<PumpViewModel>();
|
cmbFlag.SelectedItem = null;
|
cmbFlag.Properties.Items.Clear();
|
pumpViewModelBindingSource.DataSource = new List<PumpViewModel>();
|
pumpFactorViewModelBindingSource.DataSource = new List<PumpFactorViewModel>();
|
|
ClearChart();
|
}
|
|
|
/// <summary>
|
///
|
/// </summary>
|
private void ClearChart()
|
{
|
|
chartControl1.BeginInit();
|
_series_default_head.Points.Clear();
|
_series_curve_head.Points.Clear();
|
_series_correct_curve_head.Points.Clear();
|
|
_series_head_diff.Points.Clear();
|
_series_hz.Points.Clear();
|
chartControl1.EndInit();
|
}
|
|
/// <summary>
|
/// 初始化数据
|
/// </summary>
|
public override void InitialDataSource()
|
{
|
stationListCtrl1.SetBindingData();
|
monitorDataSourcesTreeList1.SetBindingData();
|
}
|
|
//泵站变换
|
private void StationListCtrl1_FocusedChangedEvent(Model.Station obj)
|
{
|
_station = obj;
|
SetBindingData(_monitorDataSources, _station);
|
}
|
|
//来源变换
|
private void MonitorDataSourcesListCtrl1_FocusedChangedEvent(Model.MonitorDataSources obj)
|
{
|
_monitorDataSources = obj;
|
SetBindingData(_monitorDataSources, _station);
|
}
|
|
/// <summary>
|
/// 绑定数据
|
/// </summary>
|
public void SetBindingData(Model.MonitorDataSources monitorDataSources, Model.Station station)
|
{
|
Clear();
|
if (monitorDataSources == null || station == null)
|
{
|
return;
|
}
|
if (barCekLoad.Checked)
|
{
|
return;
|
}
|
var packets = _bll.Get(monitorDataSources.ID, station.ID);
|
_pump_list = new BLL.Equipment().GetPumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, station.ID);
|
var flag_list = _pump_list.Select(x => x.SortCode).OrderBy(x => x).ToList();
|
var flag_pump_dict = _pump_list.ToDictionary(x => x.SortCode, x => x.RatedParas);
|
var flag_qh_curve_dict = new Dictionary<int, Model.CurveExpress>();
|
var bll_curve = new BLL.PumpCurve();
|
foreach (var pump in _pump_list)
|
{
|
Model.CurveExpress qh = null;
|
var curve_info = bll_curve.GetDefaultWorkingByPumpID(pump.ID)?.CurveInfo;
|
if (curve_info?.CurveQH != null)
|
{
|
qh = curve_info.CurveQH;
|
}
|
flag_qh_curve_dict.Add(pump.SortCode, qh);
|
}
|
cmbFlag.Properties.Items.AddRange(flag_list);
|
|
var pipe_flow_id_list = GlobalHelperW.GetPipeFlowIdList(station.SortCode);
|
var pipe_pressure_id_list = GlobalHelperW.GetPipePressureIdList(station.SortCode);
|
SetBindingData(packets, pipe_flow_id_list, pipe_pressure_id_list, flag_pump_dict, flag_qh_curve_dict);
|
}
|
|
/// <summary>
|
/// 绑定数据
|
/// </summary>
|
public void SetBindingData(List<Model.StationSignalRecordPacket> packet_list, List<string> pipe_flow_id_list, List<string> pipe_pressure_id_list, Dictionary<int, Model.Pump> flag_pump_dict, Dictionary<int, Model.CurveExpress> flag_qh_curve_dict)
|
{
|
if (packet_list == null || !packet_list.Any())
|
{
|
Clear();
|
return;
|
}
|
|
if (flag_pump_dict == null || !flag_pump_dict.Any())
|
{
|
Clear();
|
return;
|
}
|
|
if (flag_qh_curve_dict == null || !flag_qh_curve_dict.Any())
|
{
|
Clear();
|
return;
|
}
|
|
var dt_start = Convert.ToDateTime(barEditDateStart.EditValue);
|
var dt_end = Convert.ToDateTime(barEditDateEnd.EditValue);
|
packet_list = packet_list.Where(x => (x.Year >= dt_start.Year && x.Year <= dt_end.Year) && (x.Month >= dt_start.Month && x.Month <= dt_end.Month)).ToList();
|
if (packet_list == null || !packet_list.Any())
|
{
|
Clear();
|
return;
|
}
|
|
|
WaitFrmHelper.ShowWaitForm();
|
var vm_list = new List<PumpViewModel>();
|
var vm_pump_facotr_list = new List<PumpFactorViewModel>();
|
|
foreach (var packet in packet_list)
|
{
|
var station_signal_records = packet.StationSignalRecords;
|
if (station_signal_records == null || !station_signal_records.Any())
|
continue;
|
var year = packet.Year;
|
var month = packet.Month;
|
foreach (var station_record in station_signal_records)
|
{
|
var model_record_dict = station_record.ModelRecordDict;
|
var pipe_flow_err = true;
|
var pipe_pressure_err = true;
|
foreach (var id in pipe_flow_id_list)
|
{
|
if (model_record_dict[id] < 1)
|
{
|
pipe_flow_err = false;
|
break;
|
}
|
}
|
foreach (var id in pipe_pressure_id_list)
|
{
|
var value = model_record_dict[id];
|
if (value < 1 || value > 40)
|
{
|
pipe_pressure_err = false;
|
break;
|
}
|
}
|
if (!pipe_flow_err || !pipe_pressure_err)
|
{
|
continue;
|
}
|
var pump_signal_records = station_record.PumpSignalRecords;
|
if (pump_signal_records == null || !pump_signal_records.Any())
|
continue;
|
pump_signal_records = pump_signal_records.OrderBy(x => x.Flag).ToList();
|
foreach (var pump_record in pump_signal_records)
|
{
|
if (pump_record.Rpm == IStation.Error.Default || pump_record.Head == IStation.Error.Default)
|
{
|
continue;
|
}
|
|
var flag = pump_record.Flag;
|
var pump = flag_pump_dict[flag];
|
var curve_qh = flag_qh_curve_dict[flag];
|
if (!pump.IsBp)
|
{
|
pump_record.Rpm = pump.Nr;
|
}
|
|
var hz = pump_record.Rpm / pump.Nr * 50;
|
hz = Math.Round(hz, 2);
|
|
|
|
var vm_pump = new PumpViewModel();
|
vm_pump.Year = year;
|
vm_pump.Month = month;
|
vm_pump.Time = station_record.Time.ToString("G");
|
vm_pump.Flag = flag;
|
vm_pump.Rpm = pump_record.Rpm;
|
vm_pump.Hz = hz;
|
vm_pump.Hz0 = Math.Round(hz, 0);
|
vm_pump.WaterLevel = pump_record.WaterLevel;
|
vm_pump.InletPressure = Math.Round(Model.CurveCalcuHelper.Mpa2M(pump_record.InletPressure), 2);
|
vm_pump.OutletPressure = Math.Round(Model.CurveCalcuHelper.Mpa2M(pump_record.OutletPressure), 2);
|
vm_pump.PressureDiff = Math.Round(vm_pump.OutletPressure - vm_pump.InletPressure, 5);
|
vm_pump.Flow = pump_record.FlowRate;
|
vm_pump.Head = pump_record.Head;
|
vm_pump.Power = pump_record.InstantaneousPower;
|
|
var curve_head = GetCurveHead(curve_qh, pump.Nr, pump_record.Rpm, pump_record.FlowRate);
|
curve_head = Math.Round(curve_head, 2);
|
var pump_head50hz = Model.CurveCalcuHelper.Calculate50HByHz(vm_pump.Head, hz);
|
var curve_head50hz = Model.CurveCalcuHelper.Calculate50HByHz(curve_head, hz);
|
|
var head_diff = pump_head50hz - curve_head50hz;
|
head_diff = Math.Round(head_diff, 5);
|
|
vm_pump.CurveHead = curve_head;
|
vm_pump.HeadDiff = head_diff;
|
vm_list.Add(vm_pump);
|
}
|
}
|
}
|
|
if (!vm_list.Any())
|
{
|
Clear();
|
return;
|
}
|
var flag_hz_head_diff_list = vm_list.Select(x => new Tuple<int, double, double>(x.Flag, x.Hz0, x.HeadDiff)).ToList();
|
var list = AnalysisHelper.GetAnalysisFactorDtoList(flag_pump_dict, flag_hz_head_diff_list);
|
|
foreach (var item in list)
|
{
|
var vm_pump_facotr = new PumpFactorViewModel();
|
vm_pump_facotr.Flag = item.Flag;
|
vm_pump_facotr.Hz = item.Hz;
|
vm_pump_facotr.STDP = item.HeadSTDP;
|
vm_pump_facotr.STDPHead = item.HeadDeviation;
|
vm_pump_facotr.Note = $"{item.Accuracy == -1}";
|
vm_pump_facotr.Round();
|
vm_pump_facotr_list.Add(vm_pump_facotr);
|
}
|
|
var group_by_flag = vm_list.GroupBy(x => new { x.Flag, x.Hz0 });
|
foreach (var flag_item in group_by_flag)
|
{
|
var flag = flag_item.Key.Flag;
|
var factor = vm_pump_facotr_list?.Find(x => x.Flag == flag && x.Hz == flag_item.Key.Hz0);
|
if (factor == null)
|
{
|
continue;
|
}
|
|
var pump = flag_pump_dict[flag];
|
var qh = flag_qh_curve_dict[flag];
|
|
var qh_correct_points = qh.DefinePoints.Select(x => new Model.CurvePoint(x.X, x.Y + factor.STDPHead ?? 0)).ToList();
|
var qh_correct = Model.FitCurveHelper.BuildCurveExpress(qh_correct_points, Model.eCurveFitType.CubicCurve);
|
foreach (var vm in flag_item)
|
{
|
vm.CorrectCurveHead = GetCurveHead(qh_correct, pump.Nr, vm.Rpm, vm.Flow);
|
vm.CorrectHeadDiff = vm.Head - vm.CorrectCurveHead;
|
|
vm.CorrectCurveHead = Math.Round(vm.CorrectCurveHead, 2);
|
vm.CorrectHeadDiff = Math.Round(vm.CorrectHeadDiff, 5);
|
|
|
vm.CorrectPressureDiff = vm.CorrectCurveHead - Model.CurveCalcuHelper.CalculateOtherPress(vm.Flow, pump.Ic, pump.Oc, null, null);
|
vm.CorrectPressureDiffDiff = vm.CorrectPressureDiff - vm.PressureDiff;
|
|
vm.CorrectPressureDiff = Math.Round(vm.CorrectPressureDiff, 2);
|
vm.CorrectPressureDiffDiff = Math.Round(vm.CorrectPressureDiffDiff, 5);
|
}
|
|
}
|
|
|
_pump_vm_list = vm_list;
|
pumpViewModelBindingSource.DataSource = vm_list;
|
pumpViewModelBindingSource.ResetBindings(false);
|
gridView1.BestFitColumns();
|
|
pumpFactorViewModelBindingSource.DataSource = vm_pump_facotr_list;
|
pumpFactorViewModelBindingSource.ResetBindings(false);
|
gridView2.BestFitColumns();
|
|
WaitFrmHelper.HideWaitForm();
|
}
|
|
private Tuple<double[], double> FilterBySTDP(double[] array, double min_dev, int count)
|
{
|
if (array == null || !array.Any())
|
{
|
return default;
|
}
|
var array_avg = array.Average();
|
var array_count = array.Count();
|
|
|
FilterOutliersHelper.STDEV(array, out double std_dev, out double std_dev_pop);
|
if (Math.Abs(std_dev_pop) < min_dev)
|
{
|
return new Tuple<double[], double>(array, std_dev_pop);
|
}
|
if (count > 3)
|
{
|
return new Tuple<double[], double>(array, std_dev_pop);
|
}
|
var filter_array = array.Where(x => !(Math.Abs(x - array_avg) > Math.Abs(std_dev_pop * 2))).ToArray();
|
if (filter_array == null || !filter_array.Any())
|
{
|
return default;
|
}
|
count++;
|
return FilterBySTDP(filter_array, min_dev, count);
|
}
|
|
private double GetCurveHead(Model.CurveExpress curve_qh, double nr, double rpm, double flow)
|
{
|
if (curve_qh == null)
|
return default;
|
var similar_qh = Model.CurveCalcuHelper.CalculateSimilarQH(curve_qh, nr, rpm);
|
if (similar_qh == null)
|
return default;
|
var head = similar_qh.GetFitPointY(flow);
|
return head;
|
}
|
|
private double GetCurveHead(Model.CurveExpress curve_qh, Model.Pump pump, double nr, double rpm, double flow, double pressure_diff)
|
{
|
if (curve_qh == null)
|
return default;
|
var similar_qh = Model.CurveCalcuHelper.CalculateSimilarQH(curve_qh, nr, rpm);
|
if (similar_qh == null)
|
return default;
|
if (flow < 1)
|
{
|
var qh_fit_point_list = similar_qh.GetFitPoints();
|
var fit_point_list = new List<Model.CurvePoint>();
|
foreach (var qh_fit_point in qh_fit_point_list)
|
{
|
var x = qh_fit_point.X;
|
if (x < 1)
|
continue;
|
var other_press = Model.CurveCalcuHelper.CalculateOtherPress(x, pump.Ic, pump.Oc, null, null);
|
var y = qh_fit_point.Y - other_press;
|
var fit_point = new Model.CurvePoint(x, y);
|
fit_point_list.Add(fit_point);
|
|
}
|
var similar_qpd = Model.FitCurveHelper.BuildCurveExpress(fit_point_list, Model.eCurveFitType.CubicCurve);
|
var qpd_fit_point_list = similar_qpd.GetFitPoints();
|
Model.FitCurveHelper.GetInterPointX(qpd_fit_point_list, pressure_diff, out double pressure_diff_flow);
|
flow = pressure_diff_flow;
|
}
|
var head = similar_qh.GetFitPointY(flow);
|
return head;
|
}
|
|
private double GetCurveHead(Model.CurveExpress curve_qh, Model.Pump pump, double nr, double rpm, double flow, double pressure_diff, out double new_flow)
|
{
|
new_flow = 0;
|
if (curve_qh == null)
|
return default;
|
var similar_qh = Model.CurveCalcuHelper.CalculateSimilarQH(curve_qh, nr, rpm);
|
if (similar_qh == null)
|
return default;
|
if (flow < 1)
|
{
|
var qh_fit_point_list = similar_qh.GetFitPoints();
|
var fit_point_list = new List<Model.CurvePoint>();
|
foreach (var qh_fit_point in qh_fit_point_list)
|
{
|
var x = qh_fit_point.X;
|
var other_press = Model.CurveCalcuHelper.CalculateOtherPress(x, pump.Ic, pump.Oc, null, null);
|
var y = qh_fit_point.Y - other_press;
|
var fit_point = new Model.CurvePoint(x, y);
|
fit_point_list.Add(fit_point);
|
|
}
|
var similar_qpd = Model.FitCurveHelper.BuildCurveExpress(fit_point_list, Model.eCurveFitType.CubicCurve);
|
var qpd_fit_point_list = similar_qpd.GetFitPoints();
|
Model.FitCurveHelper.GetInterPointX(qpd_fit_point_list, pressure_diff, out double pressure_diff_flow);
|
if (pressure_diff_flow < 1)
|
{
|
var qpd_ex_fit_point_list = Model.FitCurveHelper.GetInterPointExX(qpd_fit_point_list, pressure_diff);
|
if (qpd_ex_fit_point_list != null)
|
{
|
pressure_diff_flow = qpd_ex_fit_point_list.First().X;
|
}
|
}
|
flow = pressure_diff_flow;
|
new_flow = flow;
|
}
|
var head = similar_qh.GetFitPointY(flow);
|
return head;
|
}
|
|
private void cmbFlag_SelectedIndexChanged(object sender, EventArgs e)
|
{
|
ClearChart();
|
if (_pump_vm_list == null || !_pump_vm_list.Any())
|
return;
|
if (!int.TryParse(cmbFlag.Text, out int flag))
|
return;
|
var vm_list = _pump_vm_list.Where(x => x.Flag == flag).ToList();
|
if (vm_list == null || !vm_list.Any())
|
return;
|
chartControl1.BeginInit();
|
foreach (var vm in vm_list)
|
{
|
//if (Math.Abs(vm.HeadDiff) > 2)
|
// continue;
|
//if (vm.Head<2)
|
// continue;
|
var time = Convert.ToDateTime(vm.Time);
|
_series_default_head.Points.Add(new SeriesPoint(time, vm.Head));
|
_series_curve_head.Points.Add(new SeriesPoint(time, vm.CurveHead));
|
_series_correct_curve_head.Points.Add(new SeriesPoint(time, vm.CorrectCurveHead));
|
|
_series_head_diff.Points.Add(new SeriesPoint(time, vm.CorrectHeadDiff));
|
_series_hz.Points.Add(new SeriesPoint(time, vm.Hz));
|
}
|
|
chartControl1.EndInit();
|
}
|
|
//加载
|
private void barCekLoad_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
SetBindingData(_monitorDataSources, _station);
|
}
|
|
|
#region 菜单
|
|
//全部展开
|
private void barBtnExpandAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
gridView1.ExpandAllGroups();
|
}
|
|
//全部折叠
|
private void barBtnCollapseAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
gridView1.CollapseAllGroups();
|
}
|
|
//检索
|
private void barCekSearch_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
if (barCekSearch.Checked)
|
gridView1.ShowFindPanel();
|
else
|
gridView1.HideFindPanel();
|
}
|
|
// 刷新数据
|
private void barBtnRefresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
InitialDataSource();
|
}
|
|
#endregion
|
|
private void barBtnExportAnalysisFactor_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
if (_monitorDataSources == null || _station == null)
|
{
|
return;
|
}
|
|
WaitFrmHelper.ShowWaitForm("正在导出");
|
|
var bol = false;
|
var flag_hz_head_diff_list = _pump_vm_list.Select(x => new Tuple<int, double, double>(x.Flag, x.Hz0, x.HeadDiff)).ToList();
|
bol = AnalysisHelper.SaveAnalysisFactorDtoList(_station.SortCode, _pump_list, flag_hz_head_diff_list);
|
|
if (!bol)
|
{
|
XtraMessageBox.Show("导出失败!");
|
return;
|
}
|
WaitFrmHelper.HideWaitForm();
|
AlertTool.ShowInfo(System.Windows.Forms.Application.OpenForms[0], "提示", "导出完成!");
|
}
|
|
private void barBtnQueryMinAndMaxRpmFlow_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
if (_monitorDataSources == null || _station == null)
|
{
|
return;
|
}
|
//if (this.barCekLoad.Checked)
|
//{
|
// return;
|
//}
|
var packets = _bll.Get(_monitorDataSources.ID, _station.ID);
|
var pump_list = new BLL.Equipment().GetPumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, _station.ID);
|
var flag_list = pump_list.Select(x => x.SortCode).OrderBy(x => x).ToList();
|
var flag_pump_dict = pump_list.ToDictionary(x => x.SortCode, x => x.RatedParas);
|
var flag_qh_curve_dict = new Dictionary<int, Model.CurveExpress>();
|
var bll_curve = new BLL.PumpCurve();
|
foreach (var pump in pump_list)
|
{
|
Model.CurveExpress qh = null;
|
var curve_info = bll_curve.GetDefaultWorkingByPumpID(pump.ID)?.CurveInfo;
|
if (curve_info?.CurveQH != null)
|
{
|
qh = curve_info.CurveQH;
|
}
|
flag_qh_curve_dict.Add(pump.SortCode, qh);
|
}
|
|
var pump_record_list = packets.SelectMany(x => x.StationSignalRecords.SelectMany(s => s.PumpSignalRecords)).ToList();
|
var flag_pump_record_list = pump_record_list.OrderBy(x => x.Flag).GroupBy(x => x.Flag);
|
|
var str_build = new StringBuilder();
|
var min_sum_flow = 0d;
|
var max_sum_flow = 0d;
|
foreach (var item in flag_pump_record_list)
|
{
|
var flag = item.Key;
|
var pump = flag_pump_dict[flag];
|
if (item.Count() < 100)
|
continue;
|
|
if (pump.IsBp)
|
{
|
var record_list = item.Where(x => x.Rpm >= 100).OrderBy(x => x.Rpm).ToList();
|
if (!record_list.Any())
|
continue;
|
var low_record_list = record_list.Take(500).ToList();
|
var low_rpm_item = GetNum(low_record_list.Select(x => x.Rpm).ToList());
|
var low_avg_head = low_record_list.Where(x => x.Rpm == low_rpm_item.Item1).Average(x => x.Head);
|
|
record_list = record_list.OrderByDescending(x => x.Rpm).ToList();
|
var high_record_list = record_list.Take(500).ToList();
|
var high_rpm_item = GetNum(high_record_list.Select(x => x.Rpm).ToList());
|
var high_avg_head = high_record_list.Where(x => x.Rpm == high_rpm_item.Item1).Average(x => x.Head);
|
|
var low_rpm = low_rpm_item.Item1;
|
var high_rpm = high_rpm_item.Item1;
|
var low_qh = Model.CurveCalcuHelper.CalculateSimilarQH(flag_qh_curve_dict[flag], pump.Nr, low_rpm);
|
var high_qh = Model.CurveCalcuHelper.CalculateSimilarQH(flag_qh_curve_dict[flag], pump.Nr, high_rpm);
|
|
var low_flow = Model.FitCurveHelper.GetInterPointExX(low_qh.GetFitPoints(), low_avg_head).First().X;
|
var high_flow = Model.FitCurveHelper.GetInterPointX(high_qh.GetFitPoints(), high_avg_head).First().X;
|
|
min_sum_flow += Math.Round(low_flow, 0);
|
max_sum_flow += Math.Round(high_flow, 0);
|
str_build.AppendLine($"{flag}#");
|
str_build.AppendLine($"最小转速:{low_rpm_item.Item1}(时间点数量:{low_rpm_item.Item2}) 平均扬程={low_avg_head:N2} 曲线流量:{low_flow:N0}");
|
str_build.AppendLine($"最大转速:{high_rpm_item.Item1}(时间点数量:{high_rpm_item.Item2}) 平均扬程={high_avg_head:N2} 曲线流量={high_flow:N0}");
|
}
|
else
|
{
|
//var record_list = item.OrderBy(x => x.Head).ToList();
|
//var low_record_list = record_list.Take(500).ToList();
|
//var low_avg_head = low_record_list.Average(x => x.Head);
|
|
//record_list = record_list.OrderByDescending(x => x.Head).ToList();
|
//var high_record_list = record_list.Take(500).ToList();
|
//var high_avg_head = high_record_list.Average(x => x.Head);
|
|
//var low_flow = Model.FitCurveHelper.GetInterPointExX(flag_qh_curve_dict[flag].GetFitPoints(), low_avg_head).First().X;
|
//var high_flow = Model.FitCurveHelper.GetInterPointX(flag_qh_curve_dict[flag].GetFitPoints(), high_avg_head).First().X;
|
|
//min_sum_flow += Math.Round(low_flow, 0);
|
//max_sum_flow += Math.Round(high_flow, 0);
|
//str_build.AppendLine($"{flag}#");
|
//str_build.AppendLine($"最小转速:{pump.Nr}(时间点数量:{500}) 平均扬程={low_avg_head:N2} 曲线流量:{low_flow:N0}");
|
//str_build.AppendLine($"最大转速:{pump.Nr}(时间点数量:{500}) 平均扬程={high_avg_head:N2} 曲线流量={high_flow:N0}");
|
}
|
|
|
}
|
|
str_build.AppendLine($"最小流量:{min_sum_flow:N0} 最大流量:{max_sum_flow:N0}");
|
var msg = str_build.ToString();
|
|
}
|
|
private Tuple<double, double> GetNum(List<double> list)
|
{
|
var groups = list.GroupBy(x => x);
|
var max_count_item = groups.OrderBy(x => x.Count()).Last();
|
return new Tuple<double, double>(max_count_item.Key, max_count_item.Count());
|
}
|
}
|
}
|