ningshuxia
2025-04-16 a67da735b33be01b24845ce03ae7551cf55ddbbc
01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs
@@ -11,7 +11,7 @@
        private readonly decimal _frequency_def = 50m;
        private readonly decimal _frequency_min = 25m;
        private readonly decimal _frequency_max = 50m;
        private readonly decimal _frequency_space = 0.1m;//频率间隔
        private readonly decimal _frequency_space = 0.2m;//频率间隔
        private readonly decimal _head_space = 0.1m;//扬程间隔
        private readonly DAL.SQLite.AnalysisPump _dal_analysis_pump = new();
@@ -25,7 +25,7 @@
        /// <param name="pumps"></param>
        /// <param name="analysis_factor_list"></param>
        /// <exception cref="Exception"></exception>
        public void AnalysisPump(List<Model.Pump> pumps, List<Model.AnalysisFactor> analysis_factor_list=null)
        public void AnalysisPump(List<Model.Pump> pumps, List<Model.AnalysisFactor> analysis_factor_list = null)
        {
            InsertLog("开始分析泵组合");
            if (pumps == null || pumps.Count < 1)
@@ -49,7 +49,7 @@
                }
                else
                {
                    var hz_head_dev_dict = analysis_factor_list?.Where(x=>x.Flag==pump.Flag)?.ToDictionary(x => x.Hz, y => y.HeadDeviation);
                    var hz_head_dev_dict = analysis_factor_list?.Where(x => x.Flag == pump.Flag)?.ToDictionary(x => x.Hz, y => y.HeadDeviation);
                    ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_min, _frequency_max, _frequency_space, pump, hz_head_dev_dict);
                }
@@ -112,7 +112,7 @@
             decimal fre_max,
             decimal fre_space,
            Model.Pump pump,
            Dictionary<double,double?> hz_head_dev_dict=null)
            Dictionary<double, double?> hz_head_dev_dict = null)
        {
            if (pump == null)
            {
@@ -127,10 +127,10 @@
            var list = new List<AnaPumpFreItem>();
            for (decimal fre = fre_max; fre >= fre_min; fre -= fre_space)
            {
                var hz= (double)Math.Round(fre, 1);
                var hz0=Math.Round(hz, 0);
                Curve.CurveExpress qh = pump.CurveQH, qp= pump.CurveQP;
                var hz = (double)Math.Round(fre, 1);
                var hz0 = Math.Round(hz, 0);
                Curve.CurveExpress qh = pump.CurveQH, qp = pump.CurveQP;
                if (exist_dict)
                {
                    if (hz_head_dev_dict.ContainsKey(hz0))
@@ -154,6 +154,131 @@
        }
        /// <summary>
        /// 分析泵
        /// </summary>
        /// <param name="pumps"></param>
        /// <param name="analysis_factor_list"></param>
        /// <exception cref="Exception"></exception>
        public void AnalysisNew(List<Model.Pump> pumps, Dictionary<int, Dictionary<int, List<CurvePoint>>> flagHzCurveDict)
        {
            InsertLog("开始分析泵");
            if (pumps == null || pumps.Count < 1)
            {
                InsertLog("分析失败:没有泵数据!");
                return;
            }
            var ana_pump_list = new List<AnaPump>();
            foreach (var pump in pumps)
            {
                var ana_pump = new AnaPump(pump);
                if (!ana_pump.AllowCalc)
                {
                    throw new Exception("曲线数据异常!");
                }
                var hzCurveDict = flagHzCurveDict[pump.Flag];
                var ana_pump_fre_item_list = new List<AnaPumpFreItem>();
                if (!pump.IsBp)
                {
                    ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_def, _frequency_def, _frequency_space, pump, hzCurveDict);
                }
                else
                {
                    ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_min, _frequency_max, _frequency_space, pump, hzCurveDict);
                }
                ana_pump.AnaPumpFreItems = ana_pump_fre_item_list;
                ana_pump_list.Add(ana_pump);
            }
            if (!ana_pump_list.Any())
            {
                InsertLog($"分析进度:没有泵可分析");
                return;
            }
            for (int i = 0; i < ana_pump_list.Count; i++)
            {
                var pump = ana_pump_list[i];
                var ana_pump_fre_items = pump.AnaPumpFreItems;
                if (ana_pump_fre_items == null || !ana_pump_fre_items.Any())
                    continue;
                var run_flag = RunFlagHelper.Get(pump.Flag, pump.IsBp);
                InsertLog($"分析进度:第{i + 1}台泵");
                var list = new List<Entity.AnalysisPump>(pump.AnaPumpFreItems.Count);
                foreach (var freItem in ana_pump_fre_items)
                {
                    var analysis_pump = new Entity.AnalysisPump();
                    analysis_pump.ID = Yw.YitIdHelper.NextId();
                    analysis_pump.Flag = pump.Flag;
                    analysis_pump.Hz = freItem.Frequency;
                    analysis_pump.CurveQH = freItem.CurveQH.ToJson();
                    analysis_pump.CurveQP = freItem.CurveQP.ToJson();
                    freItem.CurveQH.GetMinMaxPointY(out double maxHead, out double minHead);
                    analysis_pump.MinFlow = Math.Round(freItem.CurveQH.Min, 4);
                    analysis_pump.MaxFlow = Math.Round(freItem.CurveQH.Max, 4);
                    analysis_pump.MaxHead = Math.Round(maxHead, 4);
                    analysis_pump.MinHead = Math.Round(minHead, 4);
                    list.Add(analysis_pump);
                }
                Inserts(i + 1, run_flag, list);
            }
            InsertLog($"分析进度:{pumps.Count}台泵,分析完毕!");
        }
        /// <summary>
        /// 获取分析泵变频项
        /// </summary>
        private static List<AnaPumpFreItem> GetAnaPumpFreItems(
             decimal fre_def,
             decimal fre_min,
             decimal fre_max,
             decimal fre_space,
            Model.Pump pump,
            Dictionary<int,List<CurvePoint>> hzCurveDict)
        {
            if (pump == null)
            {
                return default;
            }
            if (pump.CurveQH == null || pump.CurveQP == null)
            {
                return default;
            }
            var list = new List<AnaPumpFreItem>();
            for (int i = (int)fre_max; i >= fre_min; i--)
            {
                var hz = i;
                if (!hzCurveDict.ContainsKey(hz))
                {
                    continue;
                }
                var qhHzCurve = hzCurveDict[hz];
                for (decimal j = 1; j >= 0; j -= fre_space)
                {
                    var fre = hz - j;
                    var qh = IStation.Curve.FitHelper.BuildCurveExpress(qhHzCurve);
                    var qp = pump.CurveQP;
                    var freItem = new AnaPumpFreItem();
                    freItem.Frequency = (double)fre;
                    freItem.CurveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(qh, (double)hz, (double)fre);
                    freItem.CurveQP = Curve.PumpCalculateHelper.CalculateSimilarQP(qp, (double)fre_def, (double)fre);
                    list.Add(freItem);
                }
            }
            return list;
        }
        #endregion
        #region AnalysisParameter