ningshuxia
2025-04-16 a67da735b33be01b24845ce03ae7551cf55ddbbc
02-desktop/WinFrmUI/IStation.WinFrmUI.Monitor/03-WorkingConditionAnalysis/00-helper/AnalysisHelper.cs
@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using static IStation.WinFrmUI.Monitor.ModelCorrectionCombinePage;
namespace IStation.WinFrmUI
{
@@ -41,7 +39,7 @@
            public double? Hz { get; set; }
            public double? Hz0 { get; set; }
        }
        public class AnalysisFactorDto
        {
            /// <summary>
@@ -92,28 +90,24 @@
            /// 运行组合
            /// </summary>
            public List<int> RunFlags { get; set; }
            public int RunCount { get; set; }
            public double MinFlow { get; set; }
            public double MaxFlow { get; set; }
            public Dictionary<int, double> PressureDiff { get; set; }
             
            public string Remark { get; set; }
            public int Count { get; set; }
        }
        public class PumpMapping
        {
            public int Flag { get; set; }
            public int Flag { get; set; }
            public string PumpId { get; set; }
            public string FlowId { get; set; }
            public string PressureId { get; set; }
            public string CurveId { get; set; }
            public string CurveId { get; set; }
            public int PumpIndex { get; set; }
            public int FlowIndex { get; set; }
            public int PressureIndex { get; set; }
@@ -135,10 +129,10 @@
        }
        #endregion
        #region Function 
        public static bool SaveAnalysisFactorDtoList(int station_index, List<Model.Equipment<Model.Pump>> eq_list, List<Tuple<int, double, double>> flag_hz_head_diff_list)
        {
            if (eq_list == null || !eq_list.Any())
@@ -156,14 +150,14 @@
            {
                return default;
            }
            all_list.ForEach(x=>x.Station=station_index);
            all_list.ForEach(x => x.Station = station_index);
            var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "分析");
            if (!Directory.Exists(root_folder))
            {
                Directory.CreateDirectory(root_folder);
            }
            List<AnalysisFactorDto> exist_list = null;
            var fileName = root_folder + "\\"  + "AnalysisFactor.json";
            var fileName = root_folder + "\\" + "AnalysisFactor.json";
            if (File.Exists(fileName))
            {
                var exist_json = File.ReadAllText(fileName);
@@ -175,7 +169,7 @@
            {
                all_list.AddRange(exist_list);
            }
            all_list= all_list.OrderBy(x=>x.Flag).ThenBy(x=>x.Hz).ToList();
            all_list = all_list.OrderBy(x => x.Flag).ThenBy(x => x.Hz).ToList();
            var json = JsonHelper.Object2Json(all_list);
            File.WriteAllText(fileName, json);
            return true;
@@ -259,7 +253,7 @@
                        var exist = exist_all_analysis_factor_list.Find(x => x.Flag == item.Flag && x.Hz == item.Hz);
                        if (exist == null)
                            continue;
                        item.HeadDeviation += exist.HeadDeviation;
                        item.HeadDeviation += exist.HeadDeviation;
                    }
                }
            }
@@ -299,7 +293,7 @@
                    vm.MinFlow = current_minQ;
                    vm.MaxFlow = current_maxQ;
                    var dev_dict = new Dictionary<int, double>();
                    List<Tuple<int,double, double>> tuple_list = item_run_flags.SelectMany(x => x.Item3).ToList();
                    List<Tuple<int, double, double>> tuple_list = item_run_flags.SelectMany(x => x.Item3).ToList();
                    var group_by_flag = tuple_list.GroupBy(x => x.Item1);
                    foreach (var flag_item in group_by_flag)
                    {
@@ -332,7 +326,7 @@
                }
            }
            return list;
            return list;
        }
        public static List<AnalysisDeviationDto> GetCalcFlowAnalysisDeviationDtoList(Dictionary<int, Model.Pump> flag_pump_dict, List<Tuple<string, double, List<Tuple<int, double, double>>>> run_flags_flow_pressure_diff_dict, double minQ = 0, double maxQ = 100000, double spaceQ = 1000)
@@ -366,14 +360,14 @@
                    vm.MinFlow = current_minQ;
                    vm.MaxFlow = current_maxQ;
                    var dev_dict = new Dictionary<int, double>();
                    List<Tuple<int, double,double>> tuple_list = item_run_flags.SelectMany(x => x.Item3).ToList();
                    List<Tuple<int, double, double>> tuple_list = item_run_flags.SelectMany(x => x.Item3).ToList();
                    var group_by_flag = tuple_list.GroupBy(x => x.Item1);
                    foreach (var flag_item in group_by_flag)
                    {
                        var flag = flag_item.Key;
                        var pump = flag_pump_dict[flag];
                        var head_diff_list = flag_item.Select(x => x.Item3).ToList();
                        var head_diff_list = flag_item.Select(x => x.Item3).ToList();
                        var head_filter_tuple = AnalysisHelper.GetFilterBySTDP(head_diff_list.ToArray(), opt_std_dev_pop);
                        var head_filter_array = head_filter_tuple.Item1;
                        var head_std_dev_pop = head_filter_tuple.Item2;
@@ -418,7 +412,7 @@
        public static List<AnalysisFactorDto> GetAnalysisFactorDtoList(Dictionary<int, Model.Pump> flag_pump_dict , List<Tuple<int, double, double>> flag_hz_head_diff_list)
        public static List<AnalysisFactorDto> GetAnalysisFactorDtoList(Dictionary<int, Model.Pump> flag_pump_dict, List<Tuple<int, double, double>> flag_hz_head_diff_list)
        {
            if (flag_pump_dict == null || !flag_pump_dict.Any())
            {
@@ -429,7 +423,7 @@
                return default;
            }
            var exist_data_analysis_factor_list = new List<AnalysisFactorDto>();
            var exist_data_analysis_factor_list = new List<AnalysisFactorDto>();
            var opt_std_dev_pop = 0.3;
            //分析5hz范围内的系数
@@ -478,20 +472,20 @@
                if (item.Count() < 5)
                    continue;
                var flag = item.Key.Item1;
                var pump = flag_pump_dict[flag];
                var head_diff_list = item.Select(x => x.Item3).ToList();
                var filter_std_dev_pop_tuple = GetFilterBySTDP(head_diff_list.ToArray(), opt_std_dev_pop);
                var filter_std_dev_pop_array = filter_std_dev_pop_tuple.Item1;
                var std_dev_pop = filter_std_dev_pop_tuple.Item2;
                var std_dev_pop = filter_std_dev_pop_tuple.Item2;
                var std_dev_pop_head_avg = filter_std_dev_pop_array.Average();
                var head_diff_avg = std_dev_pop_head_avg;
                if (Math.Abs(head_diff_avg) > 5)
                    continue;
                if (Math.Abs(std_dev_pop) > 1)
                    continue;
                if (Math.Abs(std_dev_pop) > 0.5 && item.Count() < 10)
                    continue;
@@ -513,7 +507,7 @@
                var pump = pump_item.Value;
                if (!pump.IsBp)
                    continue;
                if(!flag_range5_hz_factor_dict.ContainsKey(flag))
                if (!flag_range5_hz_factor_dict.ContainsKey(flag))
                    continue;
                var range5_hz_item = flag_range5_hz_factor_dict[flag];
                for (int hz = 1; hz <= 50; hz++)
@@ -540,7 +534,7 @@
                    {
                        var hz_list = range5_hz_item.Select(x => x.Key).ToList();
                        var similar_hz = hz_list.Where(x => x >= hz_key)?.OrderBy(x => x).FirstOrDefault();
                        if (similar_hz == null|| similar_hz.Value==0)
                        if (similar_hz == null || similar_hz.Value == 0)
                        {
                            similar_hz = hz_list.OrderByDescending(x => x).FirstOrDefault();
                        }
@@ -570,8 +564,8 @@
            all_analysis_factor_list = all_analysis_factor_list.OrderBy(x => x.Flag).ThenBy(x => x.Hz).ToList();
            return all_analysis_factor_list;
        }
        public static Tuple<double[], double> GetFilterBySTDP(double[] array, double min_dev=0.3, int start_index = 0, int max_iteration_count = 1)
        public static Tuple<double[], double> GetFilterBySTDP(double[] array, double min_dev = 0.3, int start_index = 0, int max_iteration_count = 1)
        {
            if (array == null || !array.Any())
            {
@@ -598,7 +592,7 @@
            start_index++;
            return GetFilterBySTDP(filter_array, min_dev, start_index, max_iteration_count);
        }
        public static List<StationMapping> GetStationMappingList()
        {
            var list = new List<StationMapping>();
@@ -649,10 +643,10 @@
            list.Add(dn2700);
            return list;
        }
        public static List<PumpMapping> GetPumpModelMappingList()
        {
            var list=new List<PumpMapping>();
            var list = new List<PumpMapping>();
            var pump11 = new PumpMapping();
            var pump12 = new PumpMapping();
@@ -670,22 +664,22 @@
            var pump26 = new PumpMapping();
            var pump27 = new PumpMapping();
            pump11.Flag = GlobalHelper.Flag11;
            pump12.Flag = GlobalHelper.Flag12;
            pump13.Flag = GlobalHelper.Flag13;
            pump14.Flag = GlobalHelper.Flag14;
            pump15.Flag = GlobalHelper.Flag15;
            pump16.Flag = GlobalHelper.Flag16;
            pump17.Flag = GlobalHelper.Flag17;
            pump18.Flag = GlobalHelper.Flag18;
            pump21.Flag = GlobalHelper.Flag21;
            pump22.Flag = GlobalHelper.Flag22;
            pump23.Flag = GlobalHelper.Flag23;
            pump24.Flag = GlobalHelper.Flag24;
            pump25.Flag = GlobalHelper.Flag25;
            pump26.Flag = GlobalHelper.Flag26;
            pump27.Flag = GlobalHelper.Flag27;
            pump11.Flag = GlobalHelperW.Flag11;
            pump12.Flag = GlobalHelperW.Flag12;
            pump13.Flag = GlobalHelperW.Flag13;
            pump14.Flag = GlobalHelperW.Flag14;
            pump15.Flag = GlobalHelperW.Flag15;
            pump16.Flag = GlobalHelperW.Flag16;
            pump17.Flag = GlobalHelperW.Flag17;
            pump18.Flag = GlobalHelperW.Flag18;
            pump21.Flag = GlobalHelperW.Flag21;
            pump22.Flag = GlobalHelperW.Flag22;
            pump23.Flag = GlobalHelperW.Flag23;
            pump24.Flag = GlobalHelperW.Flag24;
            pump25.Flag = GlobalHelperW.Flag25;
            pump26.Flag = GlobalHelperW.Flag26;
            pump27.Flag = GlobalHelperW.Flag27;
            pump11.PumpId = "Pump11";
            pump12.PumpId = "Pump12";
            pump13.PumpId = "Pump13";
@@ -765,13 +759,13 @@
            list.Add(pump24);
            list.Add(pump25);
            list.Add(pump26);
            list.Add(pump27);
            list.Add(pump27);
            return list;
        }
        public static List<string> GetPatternIdList()
        {
            var list = new List<string>();
            var list = new List<string>();
            list.Add("Pump11");
            list.Add("Pump12");
            list.Add("Pump13");
@@ -831,7 +825,7 @@
            wl_dict.Add("RPump25", 0);
            wl_dict.Add("RPump26", 0);
            wl_dict.Add("RPump27", 0);
            double? r1 = null, r2 = null;
            foreach (var item in flag_pressure_diff_dev)