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(); this.PageTitle.Caption = "数据修正"; this.gridView1.SetNormalView(); this.gridView2.SetNormalView(); this.colYear.Visible = false; this.colMonth.Visible = false; this.colHzRound.Visible = false; this.colPower.Visible = false; this.colWaterLevel.Visible = false; this.colInletPressure.Visible = false; this.colTime.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime; this.colTime.DisplayFormat.FormatString = "G"; this.repositoryItemDateEdit1.SetOnlyShowYearMonth(); this.repositoryItemDateEdit2.SetOnlyShowYearMonth(); this.barEditDateStart.EditValue = new DateTime(2024, 1, 1); this.barEditDateEnd.EditValue = new DateTime(2024, 9, 1); this.cmbFlag.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; this.stationListCtrl1.FocusedChangedEvent += StationListCtrl1_FocusedChangedEvent; this.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() { this.chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;//是否在图表上显示图例 this.chartControl1.CrosshairOptions.ShowOnlyInFocusedPane = false; // Access the diagram's properties.把 Diagram 对象转换为所需的图象类型 _diagram = (SwiftPlotDiagram)this.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 (this.STDP.HasValue) { this.STDP = Math.Round(this.STDP.Value, 5); } if (this.STDPHead.HasValue) { this.STDPHead = Math.Round(this.STDPHead.Value, 5); } } } #endregion private BLL.StationSignalRecordPacket _bll = new BLL.StationSignalRecordPacket(); private Model.Station _station = null; private Model.MonitorDataSources _monitorDataSources = null; private List _pump_vm_list = null; private List> _pump_list = null; /// /// 清空数据 /// public void Clear() { _pump_vm_list = new List(); this.cmbFlag.SelectedItem = null; this.cmbFlag.Properties.Items.Clear(); this.pumpViewModelBindingSource.DataSource = new List(); this.pumpFactorViewModelBindingSource.DataSource = new List(); ClearChart(); } /// /// /// private void ClearChart() { this.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(); this.chartControl1.EndInit(); } /// /// 初始化数据 /// public override void InitialDataSource() { this.stationListCtrl1.SetBindingData(); this.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); } /// /// 绑定数据 /// public void SetBindingData(Model.MonitorDataSources monitorDataSources, Model.Station station) { Clear(); if (monitorDataSources == null || station == null) { return; } if (this.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(); 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); } this.cmbFlag.Properties.Items.AddRange(flag_list); var pipe_flow_id_list = GlobalHelper.GetPipeFlowIdList(station.SortCode); var pipe_pressure_id_list = GlobalHelper.GetPipePressureIdList(station.SortCode); SetBindingData(packets, pipe_flow_id_list, pipe_pressure_id_list, flag_pump_dict, flag_qh_curve_dict); } /// /// 绑定数据 /// public void SetBindingData(List packet_list,List pipe_flow_id_list, List pipe_pressure_id_list, Dictionary flag_pump_dict, Dictionary 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(this.barEditDateStart.EditValue); var dt_end = Convert.ToDateTime(this.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(); var vm_pump_facotr_list = new List(); 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(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; this.pumpViewModelBindingSource.DataSource = vm_list; this.pumpViewModelBindingSource.ResetBindings(false); this.gridView1.BestFitColumns(); this.pumpFactorViewModelBindingSource.DataSource = vm_pump_facotr_list; this.pumpFactorViewModelBindingSource.ResetBindings(false); this.gridView2.BestFitColumns(); WaitFrmHelper.HideWaitForm(); } private Tuple 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(array, std_dev_pop); } if (count > 3) { return new Tuple(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(); 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(); 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(this.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; this.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)); } this.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) { this.gridView1.ExpandAllGroups(); } //全部折叠 private void barBtnCollapseAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.gridView1.CollapseAllGroups(); } //检索 private void barCekSearch_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (this.barCekSearch.Checked) this.gridView1.ShowFindPanel(); else this.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(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(); 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 GetNum(List list) { var groups = list.GroupBy(x => x); var max_count_item = groups.OrderBy(x => x.Count()).Last(); return new Tuple(max_count_item.Key,max_count_item.Count()); } } }